我正在寻找有关在具有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}
}
当我执行此命令时,该命令在本地而不是远程运行。
我在这里没有丰富的经验,正在寻求帮助,但是我开始将工作中的某些任务自动化。
请提出一些提示
我真的很感激
谢谢
答案 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" }