Powershell 在yaml脚本中使用msiexec.exe

Powershell 在yaml脚本中使用msiexec.exe,powershell,validation,yaml,gitlab-ci,windows-installer,Powershell,Validation,Yaml,Gitlab Ci,Windows Installer,我目前在gitlab项目中有一个yml脚本,它在Windows7企业中的powershell环境中运行,以便将某些操作作为CI过程的一部分进行自动化 我添加了一行挂起进程,它永远不会结束。。。我怀疑该命令出于某种原因不是100%powershell友好的: - 'msiexec.exe /i "$vars["setup"]" /qn /L*V "F:\Logs\install.log"' - 'msiexec.exe /x "$vars["setup"]" /qn /L*V "F:\Logs\i

我目前在gitlab项目中有一个yml脚本,它在Windows7企业中的powershell环境中运行,以便将某些操作作为CI过程的一部分进行自动化

我添加了一行挂起进程,它永远不会结束。。。我怀疑该命令出于某种原因不是100%powershell友好的:

- 'msiexec.exe /i "$vars["setup"]" /qn /L*V "F:\Logs\install.log"'
- 'msiexec.exe /x "$vars["setup"]" /qn /L*V "F:\Logs\install.log"'
因此,我决定将其更改为一个新命令,对应的命令有许多“and”,因此yml验证器不接受它:

- '(Start-Process -FilePath msiexec.exe -ArgumentList "/i $vars['setup'] /qn /L*V 'F:\Logs\install.log'" -Wait -PassThru).ExitCode'
- '(Start-Process -FilePath msiexec.exe -ArgumentList "/x $vars['setup'] /qn /L*V 'F:\Logs\install.log'" -Wait -PassThru).ExitCode'
我的问题是,在这种情况下,安装和卸载应用程序的最佳方式是什么?(第一个或第二个选项(甚至是新选项))

我应该纠正什么来运行它

非常感谢

编辑:

下面是完整的.gitlab-ci.yml:

不知道该脚本如何运行,因为PowerShell有自己的脚本文件格式,并且不是YAML。但是,我可以发现一些问题:

msiexec.exe /i "$vars["setup"]" /qn /L*V "F:\Logs\install.log"
这将扩大到

msiexec.exe /i "System.Collections.Hashtable[" "setup]" /qn /L*V "F:\Logs\install.log"
我想您可以发现哪里出了问题。当然,出于同样的原因,您的第二种方法不会起作用。PowerShell中本机命令参数处理的一般规则:

  • 别装聪明
  • 如果不需要扩展,请使用
    -->%
    保持简单
  • 就你的情况而言,我想以下几点就足够了:

    msiexec.exe /i $vars["setup"] /qn /L*V F:\Logs\install.log
    
    请记住,参数列表仍然由PowerShell解析和计算,因此,一旦您开始使用引号,PowerShell将对字符串应用通常的规则,这在这里是不需要的。这与基于文本的shell(如
    cmd
    )不同,后者只需进行文本扩展,然后尝试执行由此产生的任何结果

    在调试这些东西时,使用本机命令打印其参数总是很有帮助的,例如如下所示:

    class EchoArgs {
      static void Main(string[] args) {
        System.Console.OutputEncoding = System.Text.Encoding.UTF8;
        for (int i = 0; i < args.Length; i++) {
          System.Console.WriteLine("[{0}]: <{1}>", i, args[i]);
        }
      }
    }
    
    类EchoArgs{
    静态void Main(字符串[]参数){
    System.Console.outpunecoding=System.Text.Encoding.UTF8;
    for(int i=0;i
    不知道该脚本是如何运行的,因为PowerShell有自己的脚本文件格式,并且不是YAML。但是,我可以发现一些问题:

    msiexec.exe /i "$vars["setup"]" /qn /L*V "F:\Logs\install.log"
    
    这将扩大到

    msiexec.exe /i "System.Collections.Hashtable[" "setup]" /qn /L*V "F:\Logs\install.log"
    
    我想您可以发现哪里出了问题。当然,出于同样的原因,您的第二种方法不会起作用。PowerShell中本机命令参数处理的一般规则:

  • 别装聪明
  • 如果不需要扩展,请使用
    -->%
    保持简单
  • 就你的情况而言,我想以下几点就足够了:

    msiexec.exe /i $vars["setup"] /qn /L*V F:\Logs\install.log
    
    请记住,参数列表仍然由PowerShell解析和计算,因此,一旦您开始使用引号,PowerShell将对字符串应用通常的规则,这在这里是不需要的。这与基于文本的shell(如
    cmd
    )不同,后者只需进行文本扩展,然后尝试执行由此产生的任何结果

    在调试这些东西时,使用本机命令打印其参数总是很有帮助的,例如如下所示:

    class EchoArgs {
      static void Main(string[] args) {
        System.Console.OutputEncoding = System.Text.Encoding.UTF8;
        for (int i = 0; i < args.Length; i++) {
          System.Console.WriteLine("[{0}]: <{1}>", i, args[i]);
        }
      }
    }
    
    类EchoArgs{
    静态void Main(字符串[]参数){
    System.Console.outpunecoding=System.Text.Encoding.UTF8;
    for(int i=0;i
    谢谢Joey,我简化了我调用msiexe.exe的方式,避免了额外的“”,因此我使用了一个普通的var,并且删除了日志的引号。(我部分遵循了你的建议:“不要尝试变得聪明”;),但我仍然不知道为什么gitlab runner不喜欢一些永远挂起它的powershell语句。。。(就像在我的第一个例子中)我没有调试的方法,也没有知道的方法。显然有些地方出了问题,我可以理解为什么本机命令没有通过您希望它通过的,但除此之外,我不确定为什么它会导致脚本挂起。谢谢Joey,我简化了调用msiexe.exe的方式,避免了额外的”“所以我使用了一个普通的var,并且删除了日志中的引号。(我已经部分遵循了您的建议:'不要试图变得聪明';),但是我仍然不知道为什么gitlab runner不喜欢一些永远挂起它的powershell语句。。。(就像我的第一个例子)我没有调试的方法,也没有知道的方法。很明显,出现了一些问题,我可以理解为什么本机命令没有通过您希望它通过的内容,但除此之外,我不确定为什么它会导致脚本挂起。