尝试使用Powershell远程运行命令但不走运

时间:2019-12-04 17:15:49

标签: powershell automation scripting

我正在寻找有关在具有mcafee代理的线路的远程计算机上运行命令的帮助,以使该命令可以远程运行。

$Machines = Get-Content -Path "C:\server_list.txt"
foreach ($computer in $Machines){
  Write-host "Executing Events on $computer" -b "yellow" -foregroundcolor "red"
  $command = Start-Process -NoNewWindow -FilePath "C:\Program Files\McAfee\Agent\cmdagent.exe" -ArgumentList "/e /l C:\temp"
  Invoke-Command -ComputerName $computer -ScriptBlock {$command}
}

当我执行此命令时,该命令在本地而不是远程运行。

我在这里没有丰富的经验,正在寻求帮助,但是我开始将工作中的某些任务自动化。

请提出一些提示

我真的很感激

谢谢

2 个答案:

答案 0 :(得分:1)

  

$command = Start-Process -NoNewWindow -FilePath "C:\Program Files\McAfee\Agent\cmdagent.exe" -ArgumentList "/e /l C:\temp"

这不会为Invoke-Command定义命令供以后执行,它立即执行 Start-Process命令,这不是您的意图,这是它在本地 运行的原因。

要解决此问题,您必须将其定义为脚本块{ ... }):
$command = { Start-Proces ... },然后按原样将其 传递给Invoke-Command的{​​{1}}参数(-ScriptBlock)(不要将其包含在{{ 1}} 再次)。

此外,我建议利用Invoke-Command -ComputerName $computer -ScriptBlock $command的功能同时并行地定位台计算机,并避免使用{ ... }来同步调用外部计算机程序在同一窗口中。

将它们放在一起:

Invoke-Command

请注意,需要使用调用操作符Start-Process来调用$machines = Get-Content -Path "C:\server_list.txt" Write-host "Executing Events on the following computers: $machines" -b "yellow" -foregroundcolor "red" # Define the command as a script block, which is a piece of PowerShell code # you can execute on demand later. # In it, execute cmdagent.exe *directly*, not via Start-Process. $command = { & "C:\Program Files\McAfee\Agent\cmdagent.exe" /e /l C:\temp } # Invoke the script block on *all* computers in parallel, with a single # Invoke-Command call. Invoke-Command -ComputerName $machines -ScriptBlock $command 可执行文件,因为它的路径被引用(由于包含空格,因此是必需的)。


或者,您可以直接在&调用中定义脚本块:

cmdagent.exe

以远程计算机为目标时的一个明显的陷阱是,您不能在(远程执行)脚本块中直接引用 local 变量,而必须通过Invoke-Command范围显式地引用它们;例如,用Invoke-Command -ComputerName $machines -ScriptBlock { & "C:\Program Files\McAfee\Agent\cmdagent.exe" /e /l C:\temp } 代替$using:-有关更多信息,请参见this answer

答案 1 :(得分:0)

问题是$command仅对您的本地会话有效-如果您尝试在远程会话中使用它,则$command$null并且什么都不做。另外,您实际上是在为$command返回的任何内容分配Start-Process,而不是您想要的命令。

只需将命令放在脚本块中(在运行时,您可以使用单个命令在每台计算机上运行此命令,而不必同步遍历每个命令):

Invoke-Command -ComputerName $Machines -ScriptBlock { Start-Process -NoNewWindow -FilePath "C:\Program Files\McAfee\Agent\cmdagent.exe" -ArgumentList "/e /l C:\temp" }