我能得到"&&"或“;-and"在PowerShell工作?

这个问题最初在2009年提出,当时powershell不支持&&操作符。 2019年,根据Jay的回答,微软在Powershell 7中增加了对&&||的支持。 https://stackoverflow.com/a/564092/234 < / p >

最初的问题

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

不幸的是,它没有提供更多的信息,我无法找到我应该用-and做什么(再次,一个众所周知的很难搜索的东西)。

我试图使用它的上下文是&;执行cmd1,如果成功,执行cmd2&;,基本上是这样:

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

如果你只是想在单行上运行多个命令,并且你不关心第一个命令是否失败,你可以使用;对于我的大多数目的来说,这是可以的。

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

194233 次浏览

这取决于上下文,但这里有一个“-”的例子:

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

这就是在文件名以“f”开头的目录中获取所有大于10kb的文件。

在CMD中,“&&”表示“执行命令1,如果成功,执行命令2”。我用它来做以下事情:

build && run_tests

在PowerShell中,你能做的最接近的事情是:

(build) -and (run_tests)

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

如果你在脚本中这样做,你可能会更好地分离语句,像这样:

build
if ($?) {
run_tests
}

2019/11/27: __abc0操作符现在可用于PowerShell 7预览5+:

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


&&||在要实现的东西列表中(仍然是),但没有作为下一个最有用的东西出现。原因是我们有-AND-OR

如果你认为这很重要,请在Connect上提出建议,我们会考虑V3。

试试这个:

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

使用:

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

它比“"&&"”稍微长一点,但它不需要编写脚本就能完成同样的事情,而且并不太难记住。

我们可以尝试这个命令,而不是使用&&方法:

try {hostname; if ($lastexitcode -eq 0) {ipconfig /all | findstr /i bios}} catch {echo err} finally {}

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

第一个测试

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

($MyVar -ne $null)返回真正的(Get-Content $MyVar)也返回真正的

第二次测试

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

($MyVar -ne $null)返回,到目前为止,我必须假设(Get-Content $MyVar)也返回

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

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

($MyVar -ne $null)返回,并通过在整个命令上返回来证明第二个条件(Get-Content "C:\MyTxt.txt")从未运行。

我认为一个简单的if语句就可以完成这个任务。一旦我看到mkelement0的响应,最后的退出状态存储在$?,我总结了以下几点:

# Set the first command to a variable
$a=somecommand


# Temporary variable to store exit status of the last command (since we can't write to "$?")
$test=$?


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

所以对于OP的例子,它将是:

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

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

cmd /c "command1 && command2"

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

详细的等效方法是将$LASTEXITCODE-eq 0结合起来:

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

我不知道为什么if ($?)没有为我工作,但这一个做到了。

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

(build_command) -and (run_tests_command)

只需安装PowerShell 7 (去这里,并滚动和展开资产部分)。这个版本实现了管道链操作符。