从Powershell脚本运行BAT文件的最安全方法


76

我无法通过Powershell脚本直接执行bat文件。例如,这在命令行上有效:

.\\my-app\my-fle.bat

当我将此命令添加到脚本时,它输出:

The term '.\\my-app\my-file.bat' is not recognized as the 
name of a cmdlet, function, script file, or operable program. 
Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.

我也尝试了以下操作,结果相同:

& .\\my-app\my-fle.bat
& ".\\my-app\my-fle.bat"
\my-app\my-fle.bat
& \my-app\my-fle.bat
& "\my-app\my-fle.bat"

注意:它必须返回lastexitcode,因为我需要验证批处理是否成功。


两个反斜杠表示服务器共享。
js2010

Answers:



34

要运行.bat并有权访问最后一个退出代码,请按以下方式运行它:

 & .\my-app\my-fle.bat

这仅my-app在相对路径中或使用驱动器号时才有效。我试图避免将脚本绑定到特定驱动器。
cmcginty 2013年

1
@Casey我想我误会了。那么my-app,文件夹是否位于您正在使用的任何驱动器的根目录下?如果是这样,请& \my-app\my-file.bat为我工作。您如何称呼.ps1脚本?
雷纳特2013年

26

尝试此操作,您的点源稍微有些偏离。编辑,为OP添加lastexitcode位。

$A = Start-Process -FilePath .\my-app\my-fle.bat -Wait -passthru;$a.ExitCode

-WindowStyle Hidden为不可见的批次添加。


那行得通。这还会返回LastExitCode中的退出状态吗?
cmcginty 2013年

要从启动进程访问$ lastexitcode,您需要将命令附加到变量并使用passthru开关,然后从变量读取exitcode。
Knuckle-Dragger

1

假设my-app是当前目录下的子目录。$ LASTEXITCODE应该位于最后一条命令中:

.\my-app\my-fle.bat

如果来自文件共享:

\\server\my-file.bat

0

@Rynant的解决方案对我有用。我还有一些其他要求:

  1. 如果在bat文件中遇到,请不要暂停
  2. (可选)将bat文件输出附加到日志文件

这是我的工作(最终):

[PS脚本代码]

& runner.bat bat_to_run.bat logfile.txt

[runner.bat]

@echo OFF

REM This script can be executed from within a powershell script so that the bat file
REM passed as %1 will not cause execution to halt if PAUSE is encountered.
REM If {logfile} is included, bat file output will be appended to logfile.
REM
REM Usage:
REM runner.bat [path of bat script to execute] {logfile}

if not [%2] == [] GOTO APPEND_OUTPUT
@echo | call %1
GOTO EXIT

:APPEND_OUTPUT
@echo | call %1  1> %2 2>&1

:EXIT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.