2017-09-05 2 views
1

여기에 제공된 응답보다 : Powershell Enter Session find path bug, 나는 스크립트에서 내 주변에서 작동하지 않는 다른 벽을 공격했습니다. 아래 스크립트는 오류를 반환합니다 :Powershell "="인식 할 수없는 cmdlet 오류가 없습니다.

The term '=' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was 
included, verify that the path is correct and try again. 

$sb = [ScriptBlock]::Create(@" 
$Acl = (Get-Item -path D:\Websites\$Sitename).GetAccessControl('Access') 
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow') 
$Acl.SetAccessRule($Ar) 
Set-Acl -path $Path -AclObject $Acl 
"@) 

Invoke-Command -Session $Session -ScriptBlock $sb 

스크립트 블록 변수 ($ sb)를 만들 수 있지만 호출 할 때 오류가 발생합니다. 나는 그것을 $ Acl 변수의 설정으로 좁혔으며, 행운을 빌어 다양한 방법으로 다시 써 보았습니다. 내가 뭘 놓치고 있니?

+1

변경을 '인용와 변수 확장에 대한 자세한 내용은 about_Quoting_Rules help topic를 참조 @ ""@'로를'@' '@'(단일 인용 여기에 문자열을 대신 큰 따옴표보다) 원 –

+0

$ sitename 변수가 스크립트 블록에 전달되면 작업을 확장해야합니까? $ acl, $ ar $ acl 및 $ path 변수가 변수로 처리되어야하지만 $ sitename 변수가 확장되어야합니다. – Karl

+0

이를 수용하기 위해 답을 업데이트했습니다. –

답변

2

큰 따옴표로 묶인 here-string을 사용하면 큰 따옴표로 묶은 일반 문자열처럼 동작합니다. 파서는 따옴표 사이의 변수 나 하위 식을 평가하고 확장합니다. 스크립트 블록 정의에서 변수가 이미 정의 컨텍스트에 존재하지 않기 때문에

, 당신은 다음과 같은 정의와 스크립트 블록으로 끝날 :

= (Get-Item -path D:\Websites\).GetAccessControl('Access') 
= New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow') 
.SetAccessRule() 
Set-Acl -path -AclObject 

당신이 볼 수 있듯이, 처음 두 문은 밖으로 시작 첫 번째 공백이 아닌 문자로 겨우 =으로 표시되며 이는 사용자가보고있는 오류의 원인입니다. 당신이 정의하는 범위에서 변수 값을 전달해야하는 경우

$sb = [ScriptBlock]::Create(@' 
$Acl = (Get-Item -path D:\Websites\$Sitename).GetAccessControl('Access') 
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow') 
$Acl.SetAccessRule($Ar) 
Set-Acl -path $Path -AclObject $Acl 
'@) 

것은, 나도이 스크립트 블록에 param 블록을 정의하는 게 좋을 것 : 대신 단일 인용 여기 문자열에

스위치

$sb = [ScriptBlock]::Create(@' 
param($Sitename) 
$Acl = (Get-Item -path D:\Websites\$Sitename).GetAccessControl('Access') 
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow') 
$Acl.SetAccessRule($Ar) 
Set-Acl -path $Path -AclObject $Acl 
'@) 
Invoke-Command -Session $Session -ScriptBlock $sb -ArgumentList $Sitename 

또는 스크립트 블록 작성하기 전에 문자열을 대체 할 -f 문자열 형식의 연산자를 사용

을 0

+0

그건 완벽하게 작동했습니다, 정말 고마워요. 나는 -f 스위치를 알지 못했다. – Karl

+2

@ 카를 미래에 google의 경우 포맷 연산자라고한다. – TheIncorrigible1