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

时间:2018-01-08 20:55:27

标签: powershell logging remote-access invoke-command

要删除我们服务器上的旧文件,我们使用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

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

有谁知道我在转发方面做错了什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

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关键字只影响控制流,而不影响函数返回的输出(显然在return语句之后创建的输出除外)。