要删除我们服务器上的旧文件,我们使用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
解决方法可能是启动到服务器的远程会话并在那里执行,但我不想只为一个命令启动和取消远程会话。
有谁知道我在转发方面做错了什么?
答案 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 ...
关于您的其他方法:
>>
重定向成功输出流,而不是详细的输出流,它仍然在远程主机上创建文件。$variable = ...
将成功输出流上的输出分配给变量,而不是详细流上的输出。return
关键字只影响控制流,而不影响函数返回的输出(显然在return
语句之后创建的输出除外)。