And*_*ehm 30 bash powershell language-comparisons
在Bash中,我可以轻松地做类似的事情
command1 && command2 || command3
Run Code Online (Sandbox Code Playgroud)
这意味着运行command1,如果command1成功运行command2,并且command1无法运行command3.
什么是PowerShell中的等价物?
mkl*_*nt0 26
问题首次提出许多年后,让我总结一下PowerShell v5.1的现状:
bash的/ &&的||和cmd控制运营商没有PowerShell的等价物,因为你不能在PowerShell中定义运营商定制,有没有很好的解决方法:
使用单独的命令(在单独的行上或用其分隔&&),并通过自动变量显式测试每个命令的成功状态||,例如:
;
$?
请参阅下文,了解PowerShell的原因command1 -arg1 -arg2; if ($?) { command2 -arg1 } # equivalent of &&并且command1 -arg1 -arg2; if (-not $?) { command2 -arg1 } # equivalent of ||通常不是解决方案.
有谈论将它们添加而回,但它似乎从来没有在列表的顶部.
-and和-or目前保留供PowerShell以后使用,所以希望可以实现与Bash相同的语法.&&yield错误消息||)1 && 1并且The token '&&' is not a valid statement separator in this version.无法替代-and和-or:Bash的控制操作符&&(短路逻辑AND)和||(短路逻辑OR)通过退出代码隐式检查命令的成功状态,而不会干扰它们的输出流 ; 例如:
ls / nosuchfile && echo 'ok'
Run Code Online (Sandbox Code Playgroud)
无论&&输出-标准输出输出(在文件中||)和stderr输出(从试图访问不存在的文件的错误信息ls) -被穿过,但/检查(不可见)退出代码的的nosuchfile命令,如果确定&&命令- ls应执行控制操作员的RHS .
echo&&在这种情况下报告退出代码,信号失败 - 因为文件ls不存在 - 因此1决定nosuchfile 失败,并通过应用短路,决定&&不需要执行命令.
请注意,这是退出代码ls,在世界成功的信号echo和0,而任何非零退出代码指示失败.
换句话说:Bash cmd.exe和bash完全独立于命令输出操作,并且只对命令的成功状态起作用.
Powershell的&&和||,与此相反,仅作用于命令标准(成功)输出,消费它,然后仅输出操作的布尔结果 ; 例如:
(Get-ChildItem \, nosuchfile) -and 'ok'
Run Code Online (Sandbox Code Playgroud)
以上:
使用和消耗的成功(标准)输出-列表的-and-并且其解释为布尔 ; -or在布尔上下文中考虑非空输入集合,因此如果至少有一个条目,则表达式求值为\.
$true 被传递,因为错误被发送到单独的流.鉴于$true返回非空成功输出,LHS计算得到nosuchfile,因此Get-ChildItem \, nosuchfile也评估RHS,$true但是,再次消耗其输出并将其解释为布尔值,作为非空字符串,它也计算为-and.
因此,'ok'表达式的总体结果$true是(唯一成功的)输出.
该净效应是:
表达式两侧的成功输出在评估期间消耗,因此被有效隐藏.-and
表达式的唯一(成功)输出是其布尔结果,$true在这种情况下(-and在英语系统的终端中呈现).
Bash必须做的是在传递给逻辑运算符时将命令的退出代码隐式地转换为布尔值.PowerShell不会这样做 - 但可以使用函数来包装命令并创建相同的行为:
> function Get-ExitBoolean($cmd) { & $cmd | Out-Null; $? }
Run Code Online (Sandbox Code Playgroud)
给出两个批处理文件:
#pass.cmd
exit
Run Code Online (Sandbox Code Playgroud)
和
#fail.cmd
exit /b 200
Run Code Online (Sandbox Code Playgroud)
......行为可以测试:
> if (Get-ExitBoolean .\pass.cmd) { write pass } else { write fail }
pass
> if (Get-ExitBoolean .\fail.cmd) { write pass } else { write fail }
fail
Run Code Online (Sandbox Code Playgroud)
应该像在Bash中一样评估逻辑运算符.首先,设置别名:
> Set-Alias geb Get-ExitBoolean
Run Code Online (Sandbox Code Playgroud)
测试:
> (geb .\pass.cmd) -and (geb .\fail.cmd)
False
> (geb .\fail.cmd) -and (geb .\pass.cmd)
False
> (geb .\pass.cmd) -and (geb .\pass.cmd)
True
> (geb .\pass.cmd) -or (geb .\fail.cmd)
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15191 次 |
| 最近记录: |