Powershell使用Invoke-Command和Get-Childitem不提供内容

时间:2016-02-26 13:49:57

标签: powershell

我在远程计算机上使用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的命令会面临同样的问题。

如何解决这个问题?

2 个答案:

答案 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实际定位远程计算机时有效。