为什么大多数输出​​未重定向到文件?

时间:2019-05-28 00:41:52

标签: batch-file

我有一个批处理脚本,可以打开PS会话作为旁路策略并执行PS脚本需要执行的所有操作

set "psFile=.\main.ps1"

Powershell.exe -ExecutionPolicy ByPass -Command "&{%psFile% %2 %3 %4 %5 %6 | Tee-Object -FilePath log.txt}"

我得到了我想要的东西:输出到控制台和文件。但是,当执行完成后打开文件时,它只包含控制台上打印的其他所有内容的一行。 99%的输出未重定向到日志文件。

那是为什么?

还有一件事,我想将此蝙蝠文件用于任何PS脚本,因此我尝试执行以下操作:

set psFile="%1"

Powershell.exe -ExecutionPolicy ByPass -Command "&{%psFile% %2 %3 %4 %5 %6 | Tee-Object -FilePath log.txt}"

当我打开CMD并键入以下内容时:

runPS.bat main.ps1 DB1

它抱怨:

  

术语'main.ps1'不被识别为cmdlet,函数,脚本文件或       可操作的程序。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后尝试       再次。

1 个答案:

答案 0 :(得分:1)

@echo off
setlocal

rem Get fullpath of 1st argument.
for %%A in ("%~1") do set "psfile=%%~fA"

rem Save log in same directory of 1st argument.
set "logfile=%~dp1log.txt"

if defined psfile (
    rem Run the PS1 file with remaining arguments and tee the piped stdout stream.
    Powershell.exe -ExecutionPolicy ByPass -Command "&{&'%psFile%' '%~2' '%~3' '%~4' '%~5' '%~6' | Tee-Object -FilePath '%logfile%'}"
)

for循环将获取第一个参数的完整路径 如果没有通过全路径。

建议将日志文件作为完整路径,以确保成功, 并知道将其保存在何处。

围绕路径的单引号有助于 可能的空格等。

经过PS1测试以显示传递的参数:

$args

似乎通过测试显示了所有标准输出。

要包含其他流,请查看About Redirection