在远程服务器上转发 Invoke-Command 的输出

Forwarding output of Invoke-Command on Remote Server

要删除我们服务器上的旧文件,我们 运行 使用 PowerShell 在服务器上执行远程命令和 Invoke-Command:

Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose
} -Computer servername -Credential $Credential -ArgumentList $ServerPath
# The parsed credentials are from a different user than the one who opened the
# shell

命令本身可以正常工作。但这只会将删除的文件写入控制台,而不是我想将它转发到一个变量/文件(最好存储在执行命令的客户端上)。

我尝试了以下选项但没有成功:

Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose 4>>"%ScriptPath%\log.txt"
} -Computer servername -Credential $Credential -ArgumentList $ServerPath
Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose >>"%ScriptPath%\log.txt"
} -Computer servername -Credential $Credential -ArgumentList $ServerPath
Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose
} 4>>"%ScriptPath%\log.txt" -Computer servername -Credential $Credential -ArgumentList $ServerPath
$log = Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose
} -Computer servername -Credential $Credential -ArgumentList $ServerPath
$log = Invoke-Command {
    Param($ServerPath)
    return (Remove-Item -Path $ServerPath -Recurse -Force -Verbose)
} -Computer servername -Credential $Credential -ArgumentList $ServerPath

一种解决方法可能是启动到服务器的远程会话并在那里执行,但我不想只为一个命令启动和取消远程会话。

有谁知道我转发哪里做错了吗?

我最初的猜测是您的第三个变体应该有效:

Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose
} 4>>"%ScriptPath%\log.txt" -Computer servername ...

然而,不幸的是,重定向冗长的 output stream 似乎不适用于远程连接。要获得您想要的结果,您需要将详细输出流合并到脚本块内的成功输出流中,然后将成功输出流重定向到脚本块外:

Invoke-Command {
    Param($ServerPath)
    Remove-Item -Path $ServerPath -Recurse -Force -Verbose 4>&1
} >>"%ScriptPath%\log.txt" -Computer servername ...

关于你的其他方法:

  • #1 不起作用,因为重定向会在 远程 主机上创建文件。
  • #2 不起作用,因为 >> 重定向成功输出流,而不是详细输出流,它仍然在远程主机上创建文件。
  • #4 不起作用,因为 $variable = ... 将成功输出流上的输出分配给变量,而不是详细流上的输出。
  • #5 因与#4 相同的原因而不起作用。 return 关键字只影响控制流,而不影响函数的输出 returns(显然,在 return 语句之后创建的输出除外)。