我有一个批处理脚本,可以打开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,函数,脚本文件或 可操作的程序。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后尝试 再次。
答案 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