在Windows PowerShell中有条件地执行进程(例如Bash中的&;&;和| |运算符)

在Windows PowerShell中有条件地执行进程(例如Bash中的&;&;和| |运算符),powershell,operators,exit-code,Powershell,Operators,Exit Code,我想知道是否有人知道根据前一个程序的退出成功/失败有条件地执行程序的方法。如果program1成功退出而不测试LASTEXITCODE变量,我有没有办法在program1之后立即执行program2?我尝试了-band和-and运算符,但没有效果,尽管我感觉它们无论如何都不会工作,最好的替代方法是分号和if语句的组合。我的意思是,在Linux上从源代码自动构建包时,&&operator无法击败: # Configure a package, compile it and install it .

我想知道是否有人知道根据前一个程序的退出成功/失败有条件地执行程序的方法。如果program1成功退出而不测试LASTEXITCODE变量,我有没有办法在program1之后立即执行program2?我尝试了-band和-and运算符,但没有效果,尽管我感觉它们无论如何都不会工作,最好的替代方法是分号和if语句的组合。我的意思是,在Linux上从源代码自动构建包时,&&operator无法击败:

# 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之间的区别(甚至是支持&&operator的内置Windows命令提示符),我需要进行调整,但如果有更简洁的方法,我很想知道。

您可以创建一个函数来实现这一点,但我知道没有直接的方法

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环境。

我也因为缺少&&而感到非常痛苦,因此根据GrayWizardX的答案编写了以下简单脚本(它不能正常工作):

如果将其保存为路径中某个目录中的rc.ps1(用于“有条件地运行”),则可以像以下方式使用它:

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

使用脚本块(大括号)作为参数而不是字符串意味着您可以在键入命令时使用制表符补全,这会更好。这个脚本几乎和&&一样好,并且可以工作。

我将调整它以使其工作(调用表达式是必需的,因为调用命令显然没有按它应该的方式工作……或者其他什么),但这肯定是有用的。谢谢你的帮助。非常感谢。使用
$LASTEXITCODE
的问题在于,它仅在PowerShell执行控制台EXE时设置。您最好使用
$?
。然后您可以将该函数别名,使其更易于调用。@Orion Edwards,它有什么难看之处@Keith Hill,说得好,我错误地使用了$LastExitCode。不是函数本身,而是调用它。当然,您可以理解,
有条件地运行(@(“a”,“b”)
a&&b
:-)还要难看,如果($?){break;}使脚本的行为像| |,以防不明显。清除
$Error
集合不是一个好主意;测试
$?
可以(
if($?){break}
用于
&
,而
if(-not$?){break}
用于
|
)。要使用
Invoke命令
,必须传递一个脚本块,因此最好这样键入
$args
参数:
[scriptblock[]]$args
。此外,为了防止副作用,请使用
调用命令-NoNewScope
-或简单地使用
操作符。任何对Bash样式
&
|
感兴趣的人都可以成为PowerShell的一部分:请为该功能投票。投票:这里:
rc {.\configure} {make} {make install}