Powershell 使用Invoke命令时重定向.bat输出
我正在尝试将.bat脚本的输出重定向到文件。脚本在另一台计算机上运行 注释行可以工作。t.txt文件在预期位置生成。我无法说服PowerShell在使用ScriptBlock时生成输出文件 当前结果是$sb文本被打印到运行此脚本的PowerShell控制台。服务器2上未生成任何文件。要将输出写入scriptblock中指定的文件,我需要什么Powershell 使用Invoke命令时重定向.bat输出,powershell,cmd,Powershell,Cmd,我正在尝试将.bat脚本的输出重定向到文件。脚本在另一台计算机上运行 注释行可以工作。t.txt文件在预期位置生成。我无法说服PowerShell在使用ScriptBlock时生成输出文件 当前结果是$sb文本被打印到运行此脚本的PowerShell控制台。服务器2上未生成任何文件。要将输出写入scriptblock中指定的文件,我需要什么 $cn = 'SERVER2' $Logfile = "D:\DBA\Scripts\monlogs\monlog_$(Get-Date -Format '
$cn = 'SERVER2'
$Logfile = "D:\DBA\Scripts\monlogs\monlog_$(Get-Date -Format 'yyyy-MM-ddTHH-mm-ss').txt"
$sb = [scriptblock]::Create("{ & cmd.exe /C D:\DBA\Scripts\mon_test_001.bat >`"$Logfile`" }")
### Invoke-Command -ComputerName $cn -ScriptBlock { & D:\DBA\Scripts\mon_test_001.bat >D:\DBA\Scripts\monlogs\t.txt 2>&1 }
Invoke-Command -ComputerName $cn -ScriptBlock $sb
编辑
在BenH的评论之后,我发现以下内容如预期的那样起作用。请注意,参数需要转义$
$sb = [scriptblock]::Create("param(`$Logfile) & cmd.exe /C D:\DBA\Scripts\mon_test_001.bat >`"$Logfile`"")
与其使用类创建方法,不如使用强制转换?然后,因为您在远程计算机上运行scriptblock,所以在局部变量上使用“$using:”范围。(PSv3+及以上版本) 否则,对于早期版本,您将需要使用param块和-ArgumentList:
[scriptblock]$sb = {param($logpath) & cmd.exe /C c:\temp\test.bat > "$logpath" }
Invoke-Command -ComputerName $cn -ScriptBlock $sb -ArgumentList $Logfile
在调用命令中使用时,脚本块中的
$logfile
与您定义的$logfile
不在同一范围内。您需要使用参数块和参数列表。(在使用Create()
方法时不能使用using作用域。而且我相信您不希望在Create()中使用花括号。)
method@BenH-太棒了!如果你愿意回答这个问题,我会选择它作为答案。谢谢。@BenH:事先使用:引用创建带有$的脚本块没有问题;重要的是调用它的上下文。@mklement0$test='test';$sb=[scriptblock]::create($using:test)
返回错误消息Using变量无法检索。Using变量只能与脚本工作流中的Invoke命令、Start Job或InlineScript一起使用。当它与Invoke命令一起使用时,Using变量只有在远程计算机上调用脚本块时才有效。@BenH:您的示例使用$Using:test
在脚本块之外,这就是它中断的原因;我所说的是$test='test';$sb={$using:test}
,正如Kenny在回答中使用的那样。@mklement0这是有意义的。
[scriptblock]$sb = {param($logpath) & cmd.exe /C c:\temp\test.bat > "$logpath" }
Invoke-Command -ComputerName $cn -ScriptBlock $sb -ArgumentList $Logfile