【问题标题】:When running a .bat file with Start-Process使用 Start-Process 运行 .bat 文件时
【发布时间】:2021-04-28 05:05:42
【问题描述】:

当我直接运行这个 .bat 文件时,它会做它应该做的事情。当我使用 start-process 时,会打开一个黑色窗口,然后立即关闭。

Start-Process \\server01\f$\filelocation\myfile.bat -Verbose -NoNewWindow

任何想法为什么它不运行?

这是批处理脚本中的内容。

MediSpan.Install.exe /Autostart:DEV_Medispan_Data

【问题讨论】:

  • myfile.bat 中可能有一个错误,但您没有向我们展示,所以我们和您一样陷入困境。此外,由于您已经混淆了路径和文件名,我们只能推测 - 如果其中任何一个包含分隔符,那么“引用完整的文件名”:"\\server01\f$\filelocation\myfile.bat" 可能会有所帮助。
  • 从 PowerShell 运行外部命令/可执行文件,它们必须正确格式化才能执行。 • PowerShell: Running Executables
  • 直接运行批处理文件没有错误。当它直接运行时,它完全按照它应该做的。
  • 如果我删除 -nonewwindow 它会提示我运行批处理脚本,我点击确定然后它就关闭了。我之前运行过其他类似这样的脚本,但从未遇到过这样的问题,所以我认为这是我忘记做的事情。
  • 使用呼叫接线员是更好的选择。请参阅我的更新以了解您的用例。但是,如果您设置在 Start-Process 上,您可以看到我的更新。请参阅我的第二次更新。

标签: powershell batch-file cmd


【解决方案1】:

扩展我的评论:

# Simple batch file
Get-Content -Path 'D:\Temp\abc.bat'
echo off
cls
echo Hello

# Run the .bat file
D:\Temp\abc.bat
# Results - no window is seen unless you are really paying attention since it will flash very fast
<#
Hello
#>

# Using the call operator vs Start-Process
& 'D:\Temp\abc.bat'
# Results - same window response as above
<#
Hello
#>


Start-Process -FilePath ' D:\Temp\abc.bat' -Wait
# Results  - same window response as above
<#
no results are displayed
#>

Start-Process -FilePath ' D:\Temp\abc.bat' -PassThru
# Results  - same window response as above - But this shows it ran
<#
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    19       3     1536       2524       0.00  10160  11 cmd
#>

$A = Start-Process -FilePath ' D:\Temp\abc.bat'-PassThru;$A.ExitCode
$A
# Results  - same window response as above - But this shows it ran
<#
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
            0        0          0       0.02  19128
#> 

如果你想看看 .bat 做了什么,那么你必须在 .bat 中暂停一下...

echo off
cls
echo Hello
pause

来自 PowerShell 的调用和 3rdP 可执行文件,来自 TechNet 链接。

  1. 电话接线员 &

为什么:用于将字符串视为 SINGLE 命令。对交易有用 带空格。

在 PowerShell V2.0 中,如果您正在运行 7z.exe (7-Zip.exe) 或其他以数字开头的 > 命令,则必须使用命令调用运算符 &。

PowerShell V3.0 解析器现在更智能了,在这种情况下,您不再需要 &。

详细信息:运行命令、脚本或脚本块。调用运算符,也称为“调用运算符”,可让您运行存储在变量中并由字符串表示的命令。因为调用操作符不解析命令,所以无法解释命令参数

示例:

& 'C:\Program Files\Windows Media Player\wmplayer.exe' "c:\videos\my home video.avi" /fullscreen

当外部命令有很多参数或者参数或路径中有空格时,事情会变得很棘手!

用空格,你必须嵌套引号,结果并不总是清楚的!

在这种情况下,最好像这样分开所有内容:

$CMD  = 'SuperApp.exe'
$arg1 = 'filename1'
$arg2 = '-someswitch'
$arg3 = 'C:\documents and settings\user\desktop\some other file.txt'
$arg4 = '-yetanotherswitch'
 
& $CMD $arg1 $arg2 $arg3 $arg4

或类似:

$AllArgs = @('filename1', '-someswitch', 'C:\documents and settings\user\desktop\some other file.txt', '-yetanotherswitch')
& 'SuperApp.exe' $AllArgs

对于 Start-Process,根据相同的 TechNet 链接。

($p = Start-Process -FilePath 'F:\SWDATINSCD_AN_19000101\MediSpan.Install.exe' -ArgumentList '/Autostart:DEV_Medispan_Data' -wait -NoNewWindow -PassThru)
$p.HasExited
$p.ExitCode

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多