我正在尝试将.bat脚本的输出重定向到文件。该脚本在另一台机器上运行。
注释行有效。 t.txt文件在预期位置生成。我无法说服PowerShell在使用ScriptBlock时生成输出文件。
当前结果是$ sb文本打印到运行此脚本的PowerShell控制台。 SERVER2上没有生成文件。如何将输出写入scriptblock中指定的文件?
$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的评论之后,我发现以下内容按预期工作。请注意,该参数需要$ escapeped。
$sb = [scriptblock]::Create("param(`$Logfile) & cmd.exe /C D:\DBA\Scripts\mon_test_001.bat >`"$Logfile`"")
答案 0 :(得分:2)
而不是类创建方法,也许铸造会起作用?然后,因为您正在远程计算机上运行脚本块,请使用" $ using:"局部变量的范围。 (PSv3 +以上)
$cn = 'SERVER2'
$Logfile = "c:\temp\$(Get-Date -Format 'yyyy-MM-ddTHH-mm-ss').txt"
[scriptblock]$sb = { & cmd.exe /C c:\temp\test.bat > "$using:Logfile" }
Invoke-Command -ComputerName $cn -ScriptBlock $sb
否则对于早期版本,您将需要使用param块和-ArgumentList:
[scriptblock]$sb = {param($logpath) & cmd.exe /C c:\temp\test.bat > "$logpath" }
Invoke-Command -ComputerName $cn -ScriptBlock $sb -ArgumentList $Logfile