【问题标题】:PowerShell sometimes fail to execute .exePowerShell 有时无法执行 .exe
【发布时间】:2023-03-15 01:41:01
【问题描述】:

我正在尝试编写脚本以使用 MSdeploy 同步 IIS 服务器。

我尝试了所有可能的方法来运行 .exe,但有时我会收到此错误:

The term 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe' 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.

当我在第一次运行后再次执行相同的脚本时,它工作正常。我最终是这样称呼它的:

& 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe' -verb:sync ...

任何想法如何防止它第一次失败?

【问题讨论】:

  • 您的脚本中是否有可能正在修改 PATH 环境变量,以便在第二次执行时,PowerShell 能够找到 msdeploy.exe?

标签: powershell webdeploy invoke-command


【解决方案1】:

为什么不使用 Web Deploy 提供的 powershell cmdlet 而不是使用 exe?这些 cmdlet 从 V3 开始默认安装。

【讨论】:

    【解决方案2】:

    我通常建议人们使用Start-Process cmdlet 来调用外部可执行文件。

    $MsDeploy = 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe';
    $ArgumentList = '-verb:sync ... ... ...';
    Start-Process -FilePath $MsDeploy -ArgumentList $ArgumentList -Wait -NoNewWindow;
    

    【讨论】:

    • 我已经按照您建议的方式进行了尝试,但第一次运行时仍然出现相同的错误。
    • 如果 exe 是控制台应用程序,即 msdeploy.exe,我认为使用 Start-Process 并没有多大好处,除了可能使用 -verb runas 启动提升的控制台来运行应用程序.使用 -ArgumentList 传递参数有点痛苦。
    • 我发现-ArgumentList 让事情变得容易多了。您不必再担心引用规则,而且可以更轻松地构建您的参数,而不是调用控制台可执行文件。
    【解决方案3】:

    请记住,C:\Program Files 会被重定向到 32 位进程,所以

    1. 确保您为 powershell.exe(或任何托管 PowerShell)启动相同的进程位数。
    2. 将 $env:ProgramFiles 用于更健壮的脚本并将其与完整路径一起放在引号中,因为路径中可能包含空格。

    要始终使用 32 位 powershell 进程,请在 32 位机器上运行:

    %SystemRoot%\system32\WindowsPowerShell\v1\powershell.exe
    

    在 64 位机器上,运行:

    %SystemRoot%\SysWOW64\WindowsPowerShell\v1\powershell.exe
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2021-03-28
      相关资源
      最近更新 更多