2016-09-03 3 views
0

일부 XML 요소를 찾아서 다른 함수로 전달하여 조작 할 수있는 함수가 있습니다. 외부 함수를 호출하면 XML 데이터가 변경되므로 결과를 명명 할 때 Set 동사를 사용했습니다. 데이터를 변경하는 함수에 WhatIf을 사용하는 것이 좋습니다.Powershell : 배열에 함수를 전달할 때 WhatIf 사용

내가 가진 문제는 XML 요소 배열을 Set-InlineCssStyle에 전달하고 있으며 각 항목을 반영하기 위해 ShouldProcess의 출력을 원한다는 것입니다.

나는 코드를 생각해 냈습니다.

... 
if ($WhatIfPreference) 
{ 
    $elements.ForEach({ 
     if ($PSCmdlet.ShouldProcess($_.Name, 'Set-InlineCssStyle')){} 
    }) 
} 
else 
{ 
    Set-InlineCssStyle -Elements $elements -Style $Style 
} 
... 

배열을 함수에 전달할 때 WhatIf을 사용하는 것이 가장 좋은 방법은 무엇입니까?

+0

가장 좋은 방법은 '설정 - InlineCssStyle''에서 ShouldProcess' 지원을 구현하고 호출하는 함수 –

+0

@MathiasR 내부 그것에 일반 매개 변수를 전달하는 것입니다. Jessen 응답에 감사드립니다. Set-InlineCssStyle은 개인 함수이므로 내보낼 수 없습니다. 필자는'Set-InlineCssStyle'을 호출하는 많은 public 함수를 가지고 있습니다. 나는이 함수들 각각에'ShouldProcess'를 함축하여 사용자가 어떤 XML 엘리먼트가 합쳐질지를 알기를 원했다. 'Set-InlineCssstyle'에 대한 호출을'ShouldProcess'에 대한 스크립트 블록으로 옮기고 여러 호출을 제외하는 것을 고려하고 있습니다. 이는 다소 비효율적이지만 성능에 큰 영향을주지는 않습니다. –

답변

0

중복 확인이 있습니다. ShouldProcess(Target,Action)-WhatIf을 사용하지 않았거나 -Confirm을 사용하고 해당 항목에 대해 yes라고 대답 한 경우 true를 반환합니다 (if-true-block을 실행 함). 따라서 전체 if($WhatIfPreference) 부분은 필요하지 않습니다. 시도 :

function TestWhatIf { 
    [CmdletBinding(SupportsShouldProcess=$true)] 
    param(
    [Parameter(ValueFromPipeline=$true)] 
    $elements 
    ) 

    Process { 
     $elements.ForEach({ 
      if ($PSCmdlet.ShouldProcess($_.Name, 'Hello')){ 
       "Hello $($_.Name)" 
      } 
     }) 

    } 
} 

출력 :

#WhatIf 
>Get-ChildItem | TestWhatIf -WhatIf 
What if: Performing the operation "Hello" on target ".dnx". 
What if: Performing the operation "Hello" on target ".nuget". 
What if: Performing the operation "Hello" on target ".vscode". 
What if: Performing the operation "Hello" on target "3D Objects". 
What if: Performing the operation "Hello" on target "Base". 
.... 

#Without WhatIf 
>Get-ChildItem | TestWhatIf 
Hello .dnx 
Hello .nuget 
Hello .vscode 
Hello 3D Objects 
Hello Base 
.... 
+0

repsonse 주셔서 감사합니다. 이 코드는 배열에서 한번 전달 될 때만'Set-InlineCssStyle'을 호출하기를 원하는 방식으로 구조화되어 있습니다. 그러나 배열의 각 항목에 대한 줄을 출력하고 싶습니다. –

+0

오케이. 나는 당신이 가지고있는 것과 비교할 때 그것을 달성하기위한 더 좋은 방법을 보지 못한다. 실제로는 Set-InlineCssStyle 안에 있어야한다. (실제로 그 일을하는 재사용 가능한 cmdlet이기 때문에). –

+1

나는 너와 @ 마티아스가 옳다고 생각한다. 그래서'ShouldProcess'를'Set-InlineCssstyle'으로 옮겼습니다. 이것은 호출 스크립트에서'-WhatIf'를 전달하고, 각각의 공용 함수를 거쳐 마지막으로'Set-InlineCssstyle'을 전달하는 것을 의미합니다. 이렇게하기 위해 각 공용 함수에'[CmdletBinding (SupportsShouldProcess = $ true)] '를 추가했습니다. 그러나 ScritpAnalyzer는 각 공용 기능에서 사용되지 않는다고 불평합니다. 그래서 나는 그들 각각에 대해이 경고를 억누르고있다. 이것은 더 나은 해결책 인 것 같습니다. –

관련 문제