当您使用双引号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有关报价和变量扩展
变化'更多信息@“” @'到'@'@'(单引号这里字符串,而不是双引号) –
那赢因为$ sitename变量被传递到脚本块中,所以需要扩展?我需要将$ acl,$ ar $ acl和$ path变量作为变量处理,但将$ sitename变量扩展为 – Karl
我已经更新了我的答案以适应该变量。 –