我可以让&&在Powershell中工作吗?


183

&&众所周知,要在Google上搜索是很难的,但是我发现的最好的是这篇文章说要使用-and

不幸的是,它没有提供更多信息,而且我也找不到我应该做的事情-and(同样,这是一个非常困难的搜索工作)

我要在其中使用的上下文是“执行cmd1,如果成功,则执行cmd2”,基本上是这样的:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

对于认识的人来说,这应该是几个简单的代表点,谢谢!


编辑:如果您只想在一行上运行多个命令,而又不在乎第一个命令是否失败,则可以使用;出于我的大多数目的,这很好

例如:kill -n myapp; ./myapp.exe


PowerShell具有-和和-或逻辑运算符。运营商是否没有按照您期望的方式工作?如果是这样,您可以在此处发布表达式。
Mohit Chakraborty

见这个问题,你想要做什么:stackoverflow.com/questions/1917271/...
joshperry

2
谁对Bash样式感兴趣&&||成为PowerShell的一部分:请在此处为该功能投票。
mklement0

1
关于对带有文字(和有效)符号的查询执行网络搜索的需要:SymbolHound为此非常有用。以下是一些与此问题相关的示例:powershell && ; powershell-和。如果使用DuckDuckGo,则可以通过来搜索SymbolHound !sym
nisavid '17

3
2019年6月更新:PowerShell团队正在实施&&||!参加GitHub PR
pilau,

Answers:


189

在CMD中,“ &&”表示“执行命令1,如果成功,则执行命令2”。我已经用它来做类似的事情:

build && run_tests

在PowerShell中,最能做的是:

(build) -and (run_tests)

它具有相同的逻辑,但是命令的输出文本丢失。不过,也许对您来说已经足够了。

如果在脚本中执行此操作,则最好将语句分开,如下所示:

build
if ($?) {
    run_tests
}

2019/11/27:该&&操作员现已可用于PowerShell 7 Preview 5+

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
RE:“他们将其删除很荒谬” –我不喜欢将PowerShell视为“删除了愚蠢部件的CMD”。 is.gd/k92B
Jay Bazuzi

90
我不喜欢将PowerShell视为“删除了笨拙部分的CMD”。我喜欢将其视为“没有任何有用位的重击”。

14
您也可以build ; if ($?) { run_tests }在命令行上执行。
docwhat16年

19
学习PowerShell时,真正沮丧的最快方法是从认为只是扩展的CMD或bash开始。它具有根本不同的模型,尤其是在输入,输出,管道和结果方面。从一个好的教程或概述开始,不要太努力使其他shell的语法起作用。您必须按照自己的意愿接受。
Mark Meuer

3
以PowerShell本身而言,如何运行命令,然后(仅在该命令成功执行后)运行另一个命令?我认为这并不是将bash想法强加于PowerShell。它是基本的shell功能。到目前为止,我所见过的最好的东西就是build ; if ($?) { run_tests }我将从现在开始使用的东西。希望PowerShell团队增加&&支持!
Nate

28

&&和|| 在要实现的事物列表上(仍然是),但没有弹出作为要添加的下一个最有用的事物。原因是我们有-AND和-OR。如果您认为它很重要,请在Connect上提出建议,我们将在V3中考虑它。


11
我已经注册了Connect,并提名了我自己的Powershell,但我不知道该如何提出建议。Connect网站确实非常复杂且令人困惑:-(
Orion Edwards,

6
我找不到所以我做了一个预先存在的请求:connect.microsoft.com/PowerShell/feedback/details/778798/...
安迪·阿里斯门迪

22
您知道,问题仍然是如何写一个等价物,如果您添加了使用 示例-AND
Kyeotic 2014年

5
这很重要,因为它是在几乎比Windows早的系统上使用的基本流量控制工具。因此,提出了Linux和Windows之间的另一个突破。
airtonix

6
我希望Jeffrey Snover在听,这种SO应该是现在实施它的足够理由。太久了,现在PowerShell开始在某些地方弹出,就像VSCode将它用作Windows中的默认终端一样。这是没有&&的总痛苦,-and吃掉了输出,一点也不相等。
Ciantic

13

试试这个:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

9
注意:如果第一个命令失败,第二个命令仍将运行。
BrunoLM

4
首选项变量$ErrorActionPreference仅决定如何处理cmdlet报告的非终止错误;外部工具诸如csca.exe从来没有报告这样的错误(他们只反映了其退出状态$?(成功标志)和$LASTEXITCODE(具体的退出代码报道)),因此您的命令行达无条件的执行两个指令(相当于cmdcsc /t:exe /out:a.exe SomeFile.cs & a.exe
mklement0

5

如果您的命令在cmd.exe中可用(类似python ./script.pyPowerShell命令,但不是ii .(例如,这意味着通过资源管理器打开当前目录)),则可以在PowerShell中运行cmd.exe。语法如下:

cmd /c "command1 && command2"

这里, &&由此问题中描述的cmd语法提供。


4
不错,升级到cmd即可访问它的其他功能。
Bill K

4

我在PowerShell中尝试了以下命令序列:

首先测试

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null)返回true并且(Get-Content $MyVar)还返回true

第二次测试

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null)返回false,到目前为止,我必须假定(Get-Content $MyVar)还返回了false

第三次测试证明甚至没有分析第二个条件。

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null)返回错误并证明了第二个条件(Get-Content "C:\MyTxt.txt")绝然,通过返回错误对整个命令。


你是对的!表现为&&运算符。即使是右侧的$()也不允许评估!
Falco Alexander

2

这个问题很老,但是对于新手来说:也许该问题正在寻找的PowerShell版本(类似但不等效)将使用-and如下:

(build_command) -and (run_tests_command)


1
在您的用例中,这可能没问题,但它的行为不像&&,因为它忽略的退出代码build_command
西蒙·布坎

这绝对不是在做正确的事。即使第一个命令失败,它也会运行第二个命令。
Nate

这是完全错误的。;等同&于cmd和;bash。绝对不同于&&cmd
phuclv

它还将两个进程的STDOUT和STDERR静音。
德拉加斯

0

它取决于上下文,但这是实际中的“-”示例:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

这样一来,目录中所有大于10kb的文件都将以“ f”开头。


1
这不是原始问题的答案,原始问题是关于执行多个命令的。
bdukes

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

它比“ &&”长一点,但是无需编写脚本即可完成相同的操作,并且不太容易记住。迟到总比不到好。:)


2
Start-Process通常是用于调用命令行实用程序的错误工具。具体来说,如此处所用,Start-Processfilename1.exe在新的控制台窗口中异步运行,并且不返回任何值,在布尔值上下文中,该结果为$false。即使您省略了Start-Process(直接调用命令行实用程序的方式),该方法也会落空,因为条件语句的结果取决于该实用程序是否产生了任何stdout输出,而该输出与该输出是否有保证的关系成功与否。
mklement0

0

我认为一个简单的if语句可以完成此任务。一旦看到mkelement0在最后一个退出状态上方的响应存储在$?中,就将以下各项放在一起:

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

因此,以op的示例为例:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

0

冗长的等效项是将$LASTEXITCODEand 结合起来-eq 0

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

我不确定为什么if ($?)对我不起作用,但是这个确实有用。


-1

我们可以尝试使用此命令来代替使用&&方法

尝试{hostname; if($ lastexitcode -eq 0){ipconfig / all | findstr / i bios}}最终抓到{ec​​ho err} {}


没有必要为try/ catch,因为它仅需要终止错误,外部工具诸如hostnameipconfigfindstr不能触发。$LASTEXITCODE仅当您想知道由外部实用程序设置的特定退出代码时才需要进行检查- $?与本地cmdlet一样,抽象的成功或失败也反映在。
mklement0

我认为@Cyber​​iron的方向正确。我认为&&在Unix中与try / catch很像,因为}当您将后面的命令短路(跳过它们)时,它不需要您将后续命令包装在一个新块中(例如)。我认为AmpAmp引发时间的函数/过滤器if (!?) { throw "last command failed" }将是移植&&到PowerShell 的非常有用的替代方法。用法csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.