English 中文(简体)
我可以在PowerShell中使用"&&"或"-and"吗?
原标题:
  • 时间:2009-02-19 01:34:04
  •  标签:

Note: This question originally asked in 2009, when powershell did not have support for the && operator. In 2019, per Jay s answer, microsoft added support for && and || in Powershell 7. https://stackoverflow.com/a/564092/234


原始问题

&& 在谷歌搜索中非常难搜索,但我找到的最好的方法是使用这篇文章,它建议使用-and

不幸的是,它没有提供更多的信息,我也找不到我应该如何处理 -and (同样,这是一个出了名难以搜索的东西)。

执行cmd1,如果成功,则执行cmd2。

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

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

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

最佳回答

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

build && run_tests

在PowerShell中,您可以做的最接近的事情是:

(build) -and (run_tests)

它有着相同的逻辑,但命令产生的输出文本被丢失。虽然可能对你而言已足够了。

如果您在脚本中执行此操作,最好将语句分开处理,就像这样:

build
if ($?) {
    run_tests
}

2019/11/27:现在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

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

cmd /c "command1 && command2"

这里,&& 是由命令行语法描述的,详情请参考此问题

I tried this sequence of commands in PowerShell:

First Test

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

($MyVar -ne $null) 返回 true(Get-Content $MyVar) 也返回 true。 括号中的代码($MyVar -ne $null)可以翻译成"变量$MyVar不等于空",而Get-Content是PowerShell语言中的一个命令,用于获取指定文件的内容。

Second Test

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

($MyVar -ne $null) 返回了,因此我必须假定(Get-Content $MyVar) 也返回了

The third test proved the second condition was not even analyzed.

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

($MyVar -ne $null) 返回了false,证明了第二个条件 (Get-Content "C:MyTxt.txt") 没有运行,因为整个命令返回了false。 (Note: Chinese characters may not display properly depending on your device's display settings.)

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

( build_command ) -并且( run_tests_command )

只需安装PowerShell 7(在这里获取,然后滚动并展开资产部分)。这个版本已经实现了管道链运算符。

一种冗长的等价方式是将$LASTEXITCODE-eq 0结合起来:

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

我不确定为什么if ($?)对我无效,但这个有效。

使用

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

它比"&&"稍微长一点,但不需要脚本就可以达到同样的效果,而且也不太难记。

我认为一个简单的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 }

我也遇到了同样的问题。原因是我正在使用旧版本的PowerShell(我已经升级到Windows 11)。在PowerShell中输入以下命令来检查版本:$PSVersionTable

我发现我实际上正在使用版本5,而最新版本是7.4。

PSVersion                      5.1.22621.963
PSEdition                      Desktop

安装最新版后(您可以单独下载或只需前往Microsoft Store),并确保您已成功切换到新版本(您可能需要额外配置以选择此版本,因为它安装新版本而不是替换旧版本)

PSVersion                      7.3.2
PSEdition                      Core

在我切换到最新版本后,&&运行得非常完美。

这取决于上下文,但这是“-and”使用的一个例子:

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

这样可以获取以"f"开头的文件夹中,文件大小大于10kb的所有文件。

在2023年,您可以在PowerShell中使用;运算符。

&& 似乎不起作用。

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

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




相关问题