我在远程计算机上使用Powershell 4.0( rem_comp )来访问另一个( loc_comp ;此处安装的Powershell 2.0)以获取列出的文件数没有文件夹:
$var1 = 'H:\scripts'
Invoke-Command -Computername loc_comp -scriptblock {(Get-Childitem $var1 -recurse | Where-Object {!$_.PSIsContainer}).count}
但是当在-scriptblock中使用$var1
时,它不会提供任何内容(既不会出现任何错误消息)。
使用时
$var1 = 'H:\scripts'
Invoke-Command -Computername loc_comp -scriptblock {(Get-Childitem $ -recurse | Where-Object {!$_.PSIsContainer}).count}
它有效!
注意:将var1
从'更改为'无效。
在本地运行没有Invoke-Command
的命令会面临同样的问题。
如何解决这个问题?
答案 0 :(得分:1)
当您使用Invoke-command和脚本块时,scriptblock无法从外部范围访问您的参数(范围规则)。
但是,您可以定义参数并将它们与-Argumentlist
一起传递示例:
Invoke-Command -ComputerName "localhost" {param($Param1=$False, $Param2=$False) Write-host "$param1 $param2" } -ArgumentList $False,$True
以下内容适用于您的示例:
Invoke-Command -Computername loc_comp -scriptblock {param($var1)(Get-Childitem $var1 -recurse | Where-Object {!$_.PSIsContainer}).count} -ArgumentList $var1
答案 1 :(得分:1)
补充CmdrTchort's helpful answer:
PS v3 引入了特殊的 using:
范围,允许直接在发送到远程计算机的脚本块中使用本地变量 (例如,$using:var1
)
这应该对您有用,因为您在上运行Invoke-Command
的计算机具有v4。
$var1 = 'H:\scripts'
Invoke-Command -Computername loc_comp -scriptblock `
{ (Get-Childitem $using:var1 -recurse | Where-Object {!$_.PSIsContainer}).count }
请注意,using:
仅在Invoke-Command
实际定位远程计算机时有效。