在远程服务器上转发 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
语句之后创建的输出除外)。
要删除我们服务器上的旧文件,我们 运行 使用 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
语句之后创建的输出除外)。