2

我正在尝试使用 invoke-command 使用此代码查找特定进程

Invoke-Command -ComputerName $selected_server.ServerName -ArgumentList $selected_server.ProcessId -ScriptBlock {Get-Process -Name "winlogon" | where{$_.Id -like $args[0]} }

该命令不起作用,但如果我使用其中包含的数值 $selected_server.ProcessId8900,而不是使用$args[0],它可以工作。

我也尝试执行这个命令来验证变量是否被正确读取,看起来是这样

Invoke-Command -ComputerName $selected_server.ServerName -ArgumentList $selected_server.ProcessId -ScriptBlock {$args[0]; $args[0].gettype().fullname}

> 8900
> System.Int32

我错过了什么吗?

4

2 回答 2

3

不知道为什么,但这有效(也许$argsforeach-object scriptblockis out of scope):

Invoke-Command -ComputerName $selected_server.ServerName `
-ArgumentList $selected_server.ProcessId -ScriptBlock `
{param ($x) Get-Process -Name "winlogon" | where{$_.Id -like $x} }
于 2013-03-04T10:58:44.433 回答
2

CB 的答案很好,可以在任何可以远程处理的地方(v2.0 及更高版本)工作,但如果您使用的是 PowerShell 3.0 -Using范围修饰符,还有另一种(更简单)的方法。看about_Remote_Variables

Invoke-Command -ComputerName $selected_server.ServerName -ArgumentList $selected_server.ProcessId -ScriptBlock {Get-Process -Name "winlogon" | where{$_.Id -like  $Using:selected_server.ProcessId} }
于 2013-03-04T13:38:28.463 回答