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

Ori*_*rds 150 syntax powershell

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

不幸的是它没有提供任何更多的信息,我无法找到我应该做的事情-and(再次,一个众所周知的难以搜索)

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

csc /t:exe /out:a.exe SomeFile.cs && a.exe
Run Code Online (Sandbox Code Playgroud)

这应该是一个容易的几个代表谁知道,谢谢!


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

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

Jay*_*uzi 149

在CMD中,'&&'表示"执行命令1,如果成功,则执行命令2".我把它用于以下事情:

build && run_tests
Run Code Online (Sandbox Code Playgroud)

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

(build) -and (run_tests)
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

build
if ($?) {
    run_tests
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为PowerShell是"删除了愚蠢部分的CMD".我喜欢把它想象成"没有任何有用位的Bash". (68认同)
  • 学习PowerShell时遇到真正挫败感的最快方法就是首先考虑它只是一个扩展的CMD或bash.它有一个根本不同的型号,*特别是*在输入,输出,管道和结果方面.从一个好的教程或概述开始,不要太努力使其他shell的语法工作.你必须按照自己的条件来接受它. (16认同)
  • 你也可以做`build; if($?){run_tests}`在命令行上也是如此. (12认同)
  • 就 PowerShell 本身而言,如何运行一个命令,然后仅当该命令成功时才运行另一个命令?我不认为这会在 PowerShell 上强加“bash”的想法。这是基本的 shell 功能。到目前为止我见过的最好的是`build; if ($?) { run_tests }` 从现在开始我将使用它。希望PowerShell团队增加`&&`支持! (7认同)
  • RE:"他们会删除"的荒谬" - 我不喜欢将PowerShell视为"删除了愚蠢部分的CMD".http://is.gd/k92B (2认同)

Jef*_*SFT 28

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

  • 你知道,问题仍然是如何写一个等价的,如果你添加一个*using*`-AND`的例子,你的答案会更有用. (17认同)
  • 我注册了Connect,并提名自己为powershell,但我无法弄清楚如何提出建议.Connect网站真的很复杂且令人困惑:-( (11认同)
  • 我找不到预先存在的请求,所以我做了一个:https://connect.microsoft.com/PowerShell/feedback/details/778798/implement-the-and-operators-that-bash-has (6认同)
  • 我希望杰弗里·斯诺弗正在倾听,这应该是现在实施它的足够理由.它已经太长了,现在PowerShell开始在地方弹出,比如VSCode将它用作Windows中的默认终端.这是没有&&的完全痛苦,` - 和'吃输出,根本不相同. (6认同)
  • 这很重要,因为它是一个基本的流量控制工具,用于比Windows更早的系统,几乎是永恒的.因此,提出了另一个突破linux和windows之间的区别. (4认同)
  • “Microsoft Connect 已停用”,是否有新的地方可以提出此要求? (2认同)

Iva*_*van 11

试试这个:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果第一个命令失败,第二个命令仍然会运行. (8认同)
  • 首选变量`$ ErrorActionPreference`仅控制_cmdlets_报告的非终止错误的处理方式; `csc`和`a.exe`之类的外部实用程序从不报告这样的错误(它们只反映它们在`$?`(成功标志)和`$ LASTEXITCODE`(报告的特定退出代码)中的退出状态),所以你的命令行相当于_both_命令的_unconditional_执行(相当于`cmd`的`csc/t:exe /out:a.exe SomeFile.cs&a.exe`) (4认同)

Cle*_*ado 6

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

第一次测试

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

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

第二次测试

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Tom*_*ota 5

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

cmd /c "command1 && command2"
Run Code Online (Sandbox Code Playgroud)

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

  • 很好,升级到 cmd 以访问它的附加功能。 (7认同)