it-swarm.com.de

Kann ich && in Powershell arbeiten?

&& ist notorisch schwer auf Google zu finden, aber das Beste, was ich gefunden habe, ist dieser Artikel der -and verwendet.

Leider gibt es keine weiteren Informationen und ich kann nicht herausfinden, was ich mit -and machen soll (wieder eine notorisch schwer zu findende Sache)

Der Kontext, in dem ich versuche, es zu verwenden, lautet "cmd1 ausführen, und wenn erfolgreich cmd2 ausgeführt wird", im Grunde Folgendes:

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

Dies sollte ein paar Wiederholungspunkte für jemanden sein, der es weiß, danke!


Bearbeiten: Wenn Sie nur mehrere Befehle in einer einzelnen Zeile ausführen möchten und es Ihnen egal ist, ob der erste Befehl fehlschlägt oder nicht, können Sie ; verwenden. Für die meisten meiner Zwecke ist das in Ordnung

Zum Beispiel: kill -n myapp; ./myapp.exe

121
Orion Edwards

In CMD bedeutet '&&' "Befehl 1 ausführen, und wenn er erfolgreich ist, Befehl 2 ausführen". Ich habe es für Dinge verwendet wie:

build && run_tests

In PowerShell können Sie am besten Folgendes tun:

(build) -and (run_tests)

Es hat dieselbe Logik, aber der Ausgabetext der Befehle geht verloren. Vielleicht ist es aber gut genug für dich.

EDIT

Wenn Sie dies in einem Skript tun, werden Sie die Anweisungen wahrscheinlich besser trennen, wie folgt:

build
if ($?) {
    run_tests
}
107
Jay Bazuzi

&& und || standen auf der Liste der Dinge, die implementiert werden sollten (sind noch), wurden jedoch nicht als das nächste nützliche Element angezeigt. Der Grund ist, dass wir -AND und -OR ..__ haben. Wenn Sie denken, dass es wichtig ist, reichen Sie bitte einen Vorschlag bei Connect ein und wir berücksichtigen ihn für V3.

27

Versuche dies:

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

Wenn Ihr Befehl in cmd.exe verfügbar ist (etwas wie python ./script.py, jedoch nicht der PowerShell-Befehl wie ii . (dh das aktuelle Verzeichnis wird mit dem Explorer geöffnet)), können Sie cmd.exe in PowerShell ausführen. Die Syntax sieht so aus:

cmd /c "command1 && command2"

&& wird hier durch die in in dieser Frage beschriebene cmd-Syntax bereitgestellt .

3
Tomoyuki Aota

Sehr alte Frage, aber für die Neulinge: Vielleicht ist die PowerShell-Version (ähnlich, aber nicht gleichwertig), nach der die Frage sucht, das Semikolon. Wie oben beschrieben, können Sie && wie folgt verwenden, ohne die Ausgabe zu verlieren:

build_command; run_tests_command

1

Ich habe diese Befehlsfolge in PowerShell ausprobiert:

Erster Test

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

($MyVar -ne $null) lieferte true und (Get-Content $MyVar) gab auch true zurück.

Zweiter Test

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

($MyVar -ne $null) hat false zurückgegeben und ich muss davon ausgehen, dass (Get-Content $MyVar) auch false zurückgegeben wird.

Der dritte Test zeigte, dass die zweite Bedingung nicht einmal analysiert wurde.

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

($MyVar -ne $null) hat false zurückgegeben und die zweite Bedingung (Get-Content "C:\MyTxt.txt") nie ausgeführt, indem er false für den gesamten Befehl zurückgibt.

1
Cleber Machado

Ich denke, eine einfache if-Anweisung kann dies erreichen. Sobald ich gesehen habe, dass die Antwort von mkelement0 über dem letzten Beendigungsstatus in $? Gespeichert ist, füge ich Folgendes zusammen:

# 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 }

Für das Beispiel der Op wäre es also:

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

In der Regel würde ich unter Linux Folgendes tun: Ruby -c learn.rb && foodcritic learn.rb

Unter Windows PS ist dies jedoch nicht möglich! Also habe ich am Ende nur eine .ps1-Datei erstellt:

Param(
  [string]$fileName
)

Ruby -c $fileName
foodcritic $fileName

und nannte es 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>
0
Lance Robbins

Ein ausführliches Äquivalent ist, $LASTEXITCODE und -eq 0 zu kombinieren: 

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

Ich bin mir nicht sicher, warum if ($?) für mich nicht funktioniert hat, aber diese hat es getan.

0
TankorSmash