2017-09-05 48 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

变化'更多信息@“” @'到'@'@'(单引号这里字符串,而不是双引号) –

+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字符串格式运算符创建脚本块之前更换它的字符串:

$sb = [ScriptBlock]::Create(@' 
$Acl = (Get-Item -path D:\Websites\{0}).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 
'@ -f $Sitename) 

about_Quoting_Rules help topic有关报价和变量扩展

+0

这很好用,非常感谢。我不知道-f开关 – Karl

+2

@Karl它在以后的谷歌中称为格式运算符。 – TheIncorrigible1

相关问题