Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 使用Invoke命令时重定向.bat输出_Powershell_Cmd - Fatal编程技术网

Powershell 使用Invoke命令时重定向.bat输出

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 '

我正在尝试将.bat脚本的输出重定向到文件。脚本在另一台计算机上运行

注释行可以工作。t.txt文件在预期位置生成。我无法说服PowerShell在使用ScriptBlock时生成输出文件

当前结果是$sb文本被打印到运行此脚本的PowerShell控制台。服务器2上未生成任何文件。要将输出写入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的评论之后,我发现以下内容如预期的那样起作用。请注意,参数需要转义$

$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