7

前のプログラムの終了の成功/失敗に応じて、プログラムを条件付きで実行する方法を誰かが知っているかどうか疑問に思います。LASTEXITCODE変数をテストせずにprogram1が正常に終了した場合、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 に答える