我可以得到&&在Powershell工作?

时间:2009-02-19 01:34:05

标签: syntax powershell

众所周知,

&&很难在谷歌上搜索,但我发现的最好的是this article,它说要使用-and

不幸的是,它没有提供任何更多的信息,我无法找到我应该用-and做什么(再次,这是一个非常难以搜索的事情)

我正在尝试使用它的上下文是“执行cmd1,如果成功,执行cmd2”,基本上就是这样:

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

对于知道的人来说,这应该是一个简单的回复点,谢谢!


编辑:如果你只是想在一行上运行多个命令而你不在乎第一个是否失败,你可以使用;对于我的大部分目的来说这很好

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

13 个答案:

答案 0 :(得分:127)

在CMD中,'&&'表示“执行命令1,如果成功,则执行命令2”。我已将它用于以下内容:

build && run_tests

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

(build) -and (run_tests)

它具有相同的逻辑,但命令的输出文本丢失。不过,也许这对你来说还不错。

修改

如果您在脚本中执行此操作,则最好将分隔语句分开,例如:

build
if ($?) {
    run_tests
}

答案 1 :(得分:27)

&安培;&安培;和||在要实现的事情列表中(仍然是)但没有弹出作为下一个最有用的东西添加。原因是我们有-AND和-OR。 如果您认为这很重要,请在Connect上提出建议,我们会将其视为V3。

答案 2 :(得分:11)

试试这个:

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

答案 3 :(得分:4)

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

cmd /c "command1 && command2"

在这里,&&in this question描述的cmd语法提供。

答案 4 :(得分:2)

我在PowerShell中尝试了这一系列命令:

Fisrt测试

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")从未运行过。

答案 5 :(得分:1)

这个问题很老,但是对于新手来说:也许该问题正在寻找的PowerShell等价物是分号。如上面的示例所示,在不丢失输出的情况下使用&&的方法如下:

build_command; run_tests_command

答案 6 :(得分:1)

只需安装PowerShell 7(go here,然后滚动并展开资产部分)。 This release已实现管道链运营商。

答案 7 :(得分: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 }

答案 8 :(得分:0)

通常,在Linux上我会做类似的事情: ruby -c learn.rb && foodcritic learn.rb

然而,在Windows PS上,不能这样做!所以我最终只是用这个来创建.ps1文件:

Param(
  [string]$fileName
)

ruby -c $fileName
foodcritic $fileName

并将其称为bamemeril.ps1

PS C:\Users\riotc> .\bamemeril.ps1 learn.rb
Syntax OK
Checking 1 files
x
FC011: Missing README in markdown format: ../README.md:1
FC031: Cookbook without metadata.rb file: ../metadata.rb:1
FC071: Missing LICENSE file: ../LICENSE:1
PS C:\Users\riotc>

答案 9 :(得分:0)

冗长的等效项是将$LASTEXITCODE-eq 0组合在一起:

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

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

答案 10 :(得分:-1)

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

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

因此,在文件名以“f”开头的目录中获取大于10kb的所有文件。

答案 11 :(得分:-1)

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

它比"&&"但是在没有脚本的情况下完成同样的事情并且不难记住。迟到总比不到好。 :)

答案 12 :(得分:-1)

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

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