繁体   English   中英

使用Invoke-Command和Get-Childitem的Powershell无法传递内容

[英]Powershell using Invoke-Command and Get-Childitem not delivering content

:为了获得无文件夹中列出的文件的数量;我使用PowerShell 4.0的远程计算机上(rem_comp)来访问另一个(PowerShell 2.0中在此安装loc_comp)

$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的命令会Invoke-Command相同的问题。

如何解决这个问题?

当您使用Invoke-command和script-block时,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

为了补充CmdrTchort的有用答案

PS v3引入了特殊的using: scope ,它允许在发送到远程计算机的脚本块中直接使用局部变量 (例如$using:var1 )。
这应该为你工作,因为你正在运行的机器Invoke-Command 有V4。

$var1 = 'H:\scripts'
Invoke-Command -Computername loc_comp -scriptblock `
  { (Get-Childitem $using:var1 -recurse | Where-Object {!$_.PSIsContainer}).count }

请注意,仅当Invoke-Command实际上以远程计算机为目标时, using: Invoke-Command using:才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM