2014-08-28 3 views
2

매개 변수의 위치 정의에 문제가 있습니다. 예를 들어, $Folder을 내 함수에 파이프하면 다른 매개 변수의 위치가 변경됩니다.매개 변수 ValueFromPipeline 및 위치 변경

일반적으로 매개 변수 $Folder에는 position=0이 있지만 기능에 파이프가 있으면 파이프 라인 기호 앞에 위치 0이 더 이상 없음을 고려하지 않습니다.

이 기능은 스위치가 있거나 스위치가없는 경우 모두 사용할 수 있습니다. $Recurse$InheritanceOn/Off입니다. 주 목적은 폴더에 대한 사용 권한을 설정하거나 상속을 설정하는 것입니다. 둘 다의 조합도 가능합니다. 가능

[CmdletBinding(SupportsShouldProcess=$True,DefaultParametersetName="SetPermissions")] 
Param(
    [parameter(Mandatory=$true,ValueFromPipeline=$true,Position=0)] 
    [ValidateNotNullOrEmpty()] 
    [ValidateScript({Test-Path $_ -PathType Container})] 
    [String[]]$Folder, 

    [parameter(Mandatory=$true,Position=1,ParameterSetName='SetPermissions')] 
    [parameter(Mandatory=$false,ParameterSetName='SetInheritance')] 
    [ValidateNotNullOrEmpty()] 
    [String]$SAMaccountName, 

    [parameter(Mandatory=$true,Position=2,ParameterSetName='SetPermissions')] 
    [parameter(Mandatory=$false,ParameterSetName='SetInheritance')] 
    [ValidateNotNullOrEmpty()] 
    [ValidateSet('ReadAndExecute','Modify','FullControl','ListFolderContents')] 
    [String]$Grant, 

    [parameter(Mandatory=$false)] 
    [ValidateNotNullOrEmpty()] 
    [String]$Domain = 'MyDomain', 

    [parameter(Mandatory=$false,Position=3,ParameterSetName='SetPermissions')] 
    [parameter(Mandatory=$true,Position=1,ParameterSetName='SetInheritance')] 
    [ValidateNotNullOrEmpty()] 
    [ValidateSet('On','Off')] 
    [String]$Inheritance, 

    [Switch]$Recurse 
) 

모든 옵션 :

# SetPermissions 
Set-ACLspecial -Folder 'C:\Folder' -SAMaccountName 'Bob' -Grant ReadAndExecute 
Set-ACLspecial -Folder 'C:\Folder' -SAMaccountName 'Bob' -Grant ReadAndExecute -Recurse 
Set-ACLspecial -Folder 'C:\Folder' -SAMaccountName 'Bob' -Grant ReadAndExecute -Inheritance On 
Set-ACLspecial -Folder 'C:\Folder' -SAMaccountName 'Bob' -Grant ReadAndExecute -Inheritance On -Recurse 

Set-ACLspecial 'C:\Folder' 'Bob' ReadAndExecute 
Set-ACLspecial 'C:\Folder' 'Bob' ReadAndExecute -Recurse 
Set-ACLspecial 'C:\Folder' 'Bob' ReadAndExecute On 
Set-ACLspecial 'C:\Folder' 'Bob' ReadAndExecute On -Recurse 

'C:\Folder' | Set-ACLspecial 'Bob' ReadAndExecute 
'C:\Folder' | Set-ACLspecial 'Bob' ReadAndExecute -Recurse 
'C:\Folder' | Set-ACLspecial 'Bob' ReadAndExecute On 
'C:\Folder' | Set-ACLspecial 'Bob' ReadAndExecute On -Recurse 

# SetInheritance 
Set-ACLspecial 'C:\Folder' -Inheritance Off 
Set-ACLspecial 'C:\Folder' -Inheritance Off -Recurse 
'C:\Folder' | Set-ACLspecial -Inheritance Off 
'C:\Folder' | Set-ACLspecial -Inheritance Off -Recurse 

현재 구문 :

Set-HCaclTEST [-Folder] <String[]> [-SAMaccountName] <String> [-Grant] <String> [-Domain <String>] [[-Inheritance] <String>] [-Recurse] [-WhatIf] [-Confirm] [<Common 
Parameters>] 

Set-HCaclTEST [-Folder] <String[]> [-SAMaccountName <String>] [-Grant <String>] [-Domain <String>] [-Inheritance] <String> [-Recurse] [-WhatIf] [-Confirm] [<CommonPa 
rameters>] 

오류 :

'C:\Folder' | Set-ACLspecial 'Bob' ReadAndExecute 
# Test-Path on 'Bob' is not working... PowerShell sees Bob as the variable `$Folder`, but it's not. 
+0

오류가 발생합니까? 아니면 예상대로 행동하지 않습니까? 오류가 발생하는 경우 질문에 추가 할 수 있습니까? –

+0

OP가 오류로 업데이트되었습니다. – DarkLite1

+0

뻔뻔한 프로모션 : [탄소 모듈] (http://get-carbon.org/help/Grant-Permission.html)의 [Grant-Permission] (http://get-carbon.org/help/Grant-Permission.html) 기능을 확인하십시오. /). 파일, 디렉토리, 레지스트리 키 및 (곧) 인증서에 대한 사용 권한을 부여합니다. –

답변

5

The Position value is only used to match unnamed parameters. 파이프 라인을 통해 전달 된 매개 변수의 이름이 지정되므로이 계산을 수행 할 때 무시됩니다. 귀하의 예에서 첫 번째 명명되지 않은 매개 변수는 Bob이므로 매개 변수의 위치가 0이기 때문에 $Folder 매개 변수에 할당됩니다. 가장 좋은 방법은 항상 스크립트에서 매개 변수 이름을 사용하는 것입니다. 그것은 그들이 이해하기 쉽게 만든다. 자신의 키 입력을 저장하려면 콘솔에서 위치 매개 변수를 사용하십시오.

PowerShell 기본 cmdlet에서 본 것부터 보면 파이프 라인 입력을받는 매개 변수는 일반적으로 위치가 결정되지 않습니다. (아마도 이런 이유로) 파이프 될 수있는 매개 변수는 파이프 라인을 통해 전달되지 않을 때 이름으로 전달되어야합니다. $Folder 매개 변수에서 Position=0을 제거하십시오.

[Parameter(Mandatory=$true,ValueFromPipeline=$true)] 
    [ValidateNotNullOrEmpty()] 
    [ValidateScript({Test-Path $_ -PathType Container})] 
    [String[]] 
    $Folder, 
+0

이것은 실제로 이유 일 수 있습니다. 그러나 온라인에서는 같은 줄에'Position'과'ValueFromPipeline = $ true'를 사용하는 사람들이 많이 있습니다. 이상한 .. – DarkLite1

+0

@ DarkLite1 내 대답에 대한 추가 정보를 추가했습니다. –

2

Hopefull 당신이 사용할 수 있습니다 에프 매개 변수 바인딩에 사용 된 논리를 ollow합니다. 그것의 발췌문 Windows Powershell in Action에서 브루스 Payette합니다.

  1. 바인딩 모든 명명 된 매개 변수은 - 대시로 시작하는 명령 줄에서 모든 인용 부호가없는 토큰을 찾을 수 있습니다. 토큰이 콜론으로 끝나면 인수가 필요합니다. 콜론이 없으면 매개 변수의 유형을보고 인수가 필요한지 확인하십시오. 실제 인수의 유형을 매개 변수에 필요한 유형으로 변환하고 매개 변수를 바인드하십시오.
  2. 모든 위치 매개 변수 바인딩 - 명령 줄에서 사용되지 않은 인수가있는 경우 위치 매개 변수를 사용하여 바인딩하지 않은 언 바운드 매개 변수를 찾습니다.
  3. 정확히 일치하는 값으로 파이프 라인에서 바인딩 - 명령이 파이프 라인의 첫 번째 명령이 아니고 파이프 라인 입력을받는 언 바운드 매개 변수가있는 경우 정확하게 유형과 일치하는 매개 변수에 바인딩을 시도하십시오.
  4. 바인드되지 않은 경우 파이프를 변환하여 값으로 바인드하십시오. - 이전 단계가 실패한 경우 형식 변환을 사용하여 바인딩을 시도하십시오.
  5. 바인드되지 않은 경우 정확하게 일치하는 이름으로 파이프 라인에서 바인딩 - 이전 단계가 실패한 경우 매개 변수의 이름과 일치하는 입력 개체의 속성을 찾습니다. 유형이 정확히 일치하면 매개 변수를 바인딩하십시오.
  6. 바인드되지 않은 경우 변환을 통해 파이프 라인에서 이름으로 바인드하십시오. 입력 개체에 이름이 매개 변수 이름과 일치하는 속성이 있고 속성 유형이 매개 변수 유형으로 변환 가능한 경우 매개 변수를 바인딩하십시오.

이 다음은 어떤 일이 발생했는지 그리고 어떤 순서로 루틴을 판단 할 수 있었으면 좋겠습니다.

예에서 'C:\Folder' | Set-ACLspecial 'Bob' ReadAndExecute 'Bob'은 파이프 라인 전에 위치가 바인딩되기 때문에 $Folder에 할당되어야합니다.

+0

예 매트, 그건 내 문제입니다. 파이프 된 내용에 추가 'ParameterSetName'을 사용해야합니까? 그래서'Bob '을'SAMaccountName'으로 봅니다. – DarkLite1

+0

파이프 라인 매개 변수 앞에 SamAccountName에 대한 매개 변수를 옮길 수 있습니다. – Matt

+0

매트, 어떻게해야합니까? 'Position = 0'은 항상 파이프 라인 매개 변수 다음에 시작됩니다. 'Position = -1'과 같은 것입니까? – DarkLite1