远程运行“Start-Process”:如何显示标准输出?

远程运行“Start-Process”:如何显示标准输出?

我有一个用于在远程计算机上安装软件的 PowerShell 脚本。

到目前为止,我已经成功使用以下代码:

$prog = "ping"
$arg = "localhost"
$computername = "MACHINE01"
invoke-command -computername $computername {param($p,$a)& $p $a} -ArgumentList $prog,$arg

我现在需要安装一个 MSI,例如“msiexec /ic:\file.msi /passive”。

我无法让 MSIEXEC 将“MSIEXEC”后面的所有内容视为参数。相反,PowerShell 只是尝试将其作为一个大命令来执行。我尝试过很多方法,主要是放置文字引号,但都无法让它工作。

我现在已经放弃了调用运算符 (&),转而使用具有“-ArgumentList”参数的“Start-Process”。 MSI 现在可以正确执行。太棒了!

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait -redirectstandardoutput c:\output.txt; get-content c:\output.txt} -ArgumentList $prog,$arg

“Start-Process”的问题在于,当使用“Invoke-Command”远程运行时,它不会产生任何控制台输出。我不得不将输出重定向到文件,然后读取该文件。有没有更好的方法?

答案1

我会尝试将其通过管道传输到 tee-object cmdlet,然后在需要时将文件保存在那里(我不知道将文件输出发送到 $null 是否可行,可惜这不是 linux,我们可以将其发送到 /dev/null,但我离题了)

这是 tee-object cmdlethttp://technet.microsoft.com/en-us/library/ee177014.aspx

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait | tee-object -file c:\output.txt} -ArgumentList $prog,$arg

这是未经测试的代码,但这通常就是您想要的。

invoke-command -computername $computername {param($p,$a) start-process $p -argumentlist $a -nonewwindow -wait | tee-object -file $null} -ArgumentList $prog,$arg

也可能有效。

相关内容