7

我想知道是否有人知道根据前一个程序的退出成功/失败有条件地执行程序的方法。如果 program1 在没有测试 LATEXITCODE 变量的情况下成功退出,我有什么办法可以在 program1 之后立即执行 program2?我尝试了 -band 和 -and 运算符无济于事,尽管我觉得它们无论如何都行不通,最好的替代品是分号和 if 语句的组合。我的意思是,当谈到在 Linux 上从源代码自动构建一个包时,&& 运算符是不可战胜的:

# Configure a package, compile it and install it
./configure && make && sudo make install

PowerShell 将要求我执行以下操作,假设我实际上可以在 PowerShell 中使用相同的构建系统:

# Configure a package, compile it and install it
.\configure ; if ($LASTEXITCODE -eq 0) { make ; if ($LASTEXITCODE -eq 0) { sudo make install } }

当然,我可以使用多行,将其保存在文件中并执行脚本,但我的想法是简洁(节省击键)。也许这只是 PowerShell 和 Bash(甚至是支持 && 运算符的内置 Windows 命令提示符)之​​间的区别,我需要适应,但如果有更清洁的方法,我很想知道。

4

2 回答 2

2

您可以创建一个函数来执行此操作,但据我所知,没有直接的方法可以执行此操作。

function run-conditionally($commands) {
   $ranAll = $false
   foreach($command in $commands) {
      invoke-command $command
      if ($LASTEXITCODE -ne 0) {
          $ranAll = $false
          break; 
      }
      $ranAll = $true
   }

   Write-Host "Finished: $ranAll"

   return $ranAll
}

然后调用它类似于

run-conditionally(@(".\configure","make","sudo make install"))

如果没有方便的 powershell 环境,这可能会出现一些错误。

于 2009-12-16T20:16:44.270 回答
1

我也因为缺少 && 而受到伤害,所以根据 GrayWizardX 的回答(不能按原样工作)编写了以下简单脚本:

foreach( $command in $args )
{
  $error.clear()
  invoke-command $command
  if ($error) { break; }
}

如果您将其保存为 rc.ps1(用于“有条件地运行”)在路径中的目录中,您可以像这样使用它:

rc {.\configure} {make} {make install}

使用脚本块(大括号)作为参数而不是字符串意味着您可以在输入命令时使用制表符完成,这要好得多。这个脚本几乎和 && 一样好,并且有效。

于 2011-08-01T19:34:24.560 回答