PowerShell "="不是可识别的 cmdlet 错误



进一步与此处给出的响应: powershell enter会话查找路径bug ,我碰到了脚本中的另一堵墙,我无法处理。以下脚本返回错误:

术语'='未被认为是CMDLET,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包括路径,请验证该路径是否正确,然后重试。

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

我可以创建脚本块变量($ sb),但是当我调用它时,我会发现错误。我将其范围缩小到$Acl变量的设置,并尝试在没有运气的情况下重写各种方式。我想念什么?

当您使用双重引用此处的弦线时,它的行为就像一个常规的双引用字符串一样 - 解析器将评估和扩展引号之间的任何变量或子表达。

由于ScriptBlock定义中的变量在定义上下文中尚不存在,因此您最终会以以下定义出现脚本块:

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

您可以看到,前两个语句仅以裸露的 =作为第一个非Whitespace字符开始,这就是您看到的错误的原因。

改用此处的单弦:

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

如果您需要从定义范围中传递变量值,我建议在ScriptBlock中定义param块:

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

或在创建ScriptBlock之前,请使用-f字符串格式运算符将其替换在字符串中:

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

有关引用和可变扩展的更多信息,请参见about_Quoting_Rules帮助主题

相关内容

  • 没有找到相关文章

最新更新