带参数的Powershell调用MSI

kin*_*13p 2 powershell

我正在使用Powershell脚本来安装Autodesk产品,但遇到了一些麻烦。

我尝试了许多不同的方法,并不断遇到错误。

使用双引号

(Start-Process "msiexec.exe" -ArgumentList ""/i $dirFiles\ABDS2017\Img\x64\RVT\RVT.msi INSTALLDIR="C:\Program Files\Autodesk\" ADSK_SETUP_EXE=1 /qb!"" -NoNewWindow -Wait -PassThru).ExitCode
Run Code Online (Sandbox Code Playgroud)

错误无法验证参数'ArgumentList'上的参数参数为null或为空。

使用变量定义InstallDir

$RevitInstallDir = "C:\Program Files\Autodesk\"
    (Start-Process "msiexec.exe" -ArgumentList "/i $dirFiles\ABDS2017\Img\x64\RVT\RVT.msi INSTALLDIR=$RevitInstallDir ADSK_SETUP_EXE=1 /qb!" -NoNewWindow -Wait -PassThru).ExitCode
Run Code Online (Sandbox Code Playgroud)

这样做我得到msiexec / option必需参数错误。

也在单引号和路径引号上尝试过

(Start-Process "msiexec.exe" -ArgumentList "/i $dirFiles\ABDS2017\Img\x64\RVT\RVT.msi INSTALLDIR="C:\Program Files\Autodesk\" ADSK_SETUP_EXE=1 /qb!" -NoNewWindow -Wait -PassThru).ExitCode
Run Code Online (Sandbox Code Playgroud)

我收到一个找不到接受参数C:\ Program的位置参数

在InstallDir上使用单引号

(Start-Process "msiexec.exe" -ArgumentList "/i $dirFiles\ABDS2017\Img\x64\RVT\RVT.msi INSTALLDIR='C:\Program Files\Autodesk\' ADSK_SETUP_EXE=1 /qb!" -NoNewWindow -Wait -PassThru).ExitCode
Run Code Online (Sandbox Code Playgroud)

这样做我得到msiexec / option必需参数错误。

在外面使用单引号

(Start-Process "msiexec.exe" -ArgumentList '/i $dirFiles\ABDS2017\Img\x64\RVT\RVT.msi INSTALLDIR="C:\Program Files\Autodesk\" ADSK_SETUP_EXE=1 /qb!' -NoNewWindow -Wait -PassThru).ExitCode
Run Code Online (Sandbox Code Playgroud)

如果执行此操作,它将阻止$ dirFiles变量工作。

我使用Start-Process的原因是因为我一个接一个地安装了许多安装程序,并且我希望一个安装程序能等到一个安装程序完成。任何帮助,将不胜感激!谢谢

编辑:没关系,我想通了。

(Start-Process "msiexec.exe" -ArgumentList "/i $dirFiles\ABDS2017\Img\x64\RVT\RVT.msi INSTALLDIR=""C:\Program Files\Autodesk\"" ADSK_SETUP_EXE=1 /qb!" -NoNewWindow -Wait -PassThru).ExitCode
Run Code Online (Sandbox Code Playgroud)

安装目录周围的双引号

从这里得到了这个主意。https://blogs.technet.microsoft.com/heyscriptingguy/2015/06/20/weekend-scripter-understanding-quotation-marks-in-powershell/

谢谢

Ans*_*ers 5

Start-Process除非您需要以提升的特权运行进程,否则不要打扰。请改用呼叫运算符喷溅。命令的退出代码存储在自动变量中 $LastExitCode

$params = '/i', "$dirFiles\ABDS2017\Img\x64\RVT\RVT.msi",
          'INSTALLDIR="C:\Program Files\Autodesk"', 'ADSK_SETUP_EXE=1',
          '/qb!'
& msiexec.exe @params
$LastExitCode
Run Code Online (Sandbox Code Playgroud)

不幸的是,您不能告诉msiexec.exe您等待安装完成,并且调用运算符也不会强制执行同步执行。如果需要等待安装完成再继续,则需要CMD-builtin start命令或Start-Process。不过,我仍然建议将参数定义为数组。

$params = '/i', "$dirFiles\ABDS2017\Img\x64\RVT\RVT.msi",
          'INSTALLDIR="C:\Program Files\Autodesk"', 'ADSK_SETUP_EXE=1',
          '/qb!'
$p = Start-Process 'msiexec.exe' -ArgumentList $params -NoNewWindow -Wait -PassThru
$p.ExitCode
Run Code Online (Sandbox Code Playgroud)

  • 我不相信用 splatting 定义的方法会等待 msi 完成安装...... (2认同)