众所周知,&&
在 Google 搜索中很难搜索,但我发现最好的是 this article,它表示要使用 -and
。
不幸的是,它没有提供更多信息,而且我无法找到我应该用 -and
做什么(同样,这是一个众所周知的难以搜索的东西)。
我试图在其中使用它的上下文是“执行 cmd1,如果成功,则执行 cmd2”,基本上是这样的:
csc /t:exe /out:a.exe SomeFile.cs && a.exe
如果您只想在一行上运行多个命令,并且不在乎第一个命令是否失败,则可以使用 ;
就我的大多数目的而言,这很好。
例如:kill -n myapp; ./myapp.exe
。
!sym
搜索 SymbolHound。
在 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!
&& 和 ||在要实施的事情列表中(仍然是),但没有作为下一个最有用的添加内容弹出。原因是我们有 -AND 和 -OR。如果您认为这很重要,请在 Connect 上提出建议,我们会考虑将其用于 V3。
-AND
的示例,您的答案会更有用
-and
吃掉了输出,根本不等价。
尝试这个:
$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
$ErrorActionPreference
仅控制如何处理 cmdlet 报告的非终止错误; csc
和 a.exe
等外部实用程序从不报告此类错误(它们仅在 $?
(成功标志)和 $LASTEXITCODE
(报告的特定退出代码)中反映其退出状态),因此您的命令行相当于 < i>无条件执行两个命令(相当于cmd
的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"
这里,&&
由 in this question 描述的 cmd 语法提供。
我在 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)
返回 false 并通过在整个命令上返回 false 来证明第二个条件 (Get-Content "C:\MyTxt.txt")
从未运行。
非常老的问题,但对于新手来说:也许问题正在寻找的 PowerShell 版本(类似但不等效)是使用 -and
,如下所示:
(build_command) -and (run_tests_command)
&&
,因为它忽略了 build_command
的退出代码。
;
相当于 cmd 中的 &
和 bash 中的 ;
。绝对和cmd中的&&
不一样
一个详细的等价物是将 $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}
它比“&&”长一点,但它无需编写脚本就可以完成同样的事情,而且不难记住。
Start-Process
通常是用于调用命令行实用程序的错误工具。具体来说,如此处使用的,Start-Process
在新的控制台窗口中异步运行 filename1.exe
并返回 nothing,在布尔上下文中计算结果为 $false
。即使您省略了 Start-Process
(这是您应该直接调用命令行实用程序的方式),该方法也会失败,因为条件的结果取决于实用程序是否产生任何标准输出输出,这没有保证关系无论成功与否。
我认为一个简单的 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 }
这取决于上下文,但这里有一个“-and”的例子:
get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }
这样就可以在文件名以“f”开头的目录中获取所有大于 10kb 的文件。
我们可以试试这个命令,而不是使用 && 方法:
try {hostname; if ($lastexitcode -eq 0) {ipconfig /all | findstr /i bios}} catch {echo err} finally {}
try
/ catch
,因为只有 terminating 错误才需要,而 hostname
、ipconfig
和 findstr
等外部实用程序无法触发这些错误。仅当您想知道由外部实用程序设置的特定退出代码时才需要检查 $LASTEXITCODE
- 抽象的成功或失败反映在 $?
中,就像使用本机 cmdlet 一样。
&&
很像 try/catch,因为它不需要您在短路后续命令(跳过它们)时将后续命令包装在一个新块中(即 }
)。我认为在 if (!?) { throw "last command failed" }
时抛出的 AmpAmp
函数/过滤器将非常有用地替代将 &&
移植到 PowerShell。 用法:csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
不定期副业成功案例分享
build ; if ($?) { run_tests }
。bash
想法强加于 PowerShell。这是基本的外壳功能。到目前为止,我见过的最好的是build ; if ($?) { run_tests }
,我将从现在开始使用它。我希望 PowerShell 团队添加&&
支持!