Kann ich && dazu bringen, in Powershell zu arbeiten?

182

&&Es ist notorisch schwer, auf Google zu suchen, aber das Beste, was ich gefunden habe, ist dieser Artikel, in dem es heißt, ihn zu verwenden -and.

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

Der Kontext, in dem ich es verwenden möchte, lautet "cmd1 ausführen und bei Erfolg cmd2 ausführen".

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

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


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

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

Orion Edwards
quelle
PowerShell verfügt über logische Operatoren -und und -oder. Arbeiten die Bediener nicht so, wie Sie es erwarten? Wenn ja, können Sie den Ausdruck hier posten.
Mohit Chakraborty
Sehen Sie diese Frage, es macht, was Sie wollen: stackoverflow.com/questions/1917271/…
joshperry
2
Wer sich für den Bash-Stil interessiert &&und ||Teil von PowerShell wird: Stimmen Sie hier für die Funktion ab .
mklement0
1
In Bezug auf die Notwendigkeit, Websuchen nach Abfragen mit wörtlichen (und signifikanten) Symbolen durchzuführen : SymbolHound ist hierfür nützlich. Hier sind einige Beispiele, die sich auf die Frage beziehen: Powershell && ; Powershell -und . Wenn Sie DuckDuckGo verwenden , können Sie SymbolHound über suchen !sym.
Nisavid
3
Update Juni 2019 : PowerShell-Team implementiert &&und ||! Wiegen Sie sich am GitHub PR
Pilau

Antworten:

188

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

build && run_tests

In PowerShell können Sie am nächsten Folgendes tun:

(build) -and (run_tests)

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

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

build
if ($?) {
    run_tests
}

27.11.2019 : Der &&Operator ist jetzt für PowerShell 7 Preview 5+ verfügbar :

PS > echo "Hello!" && echo "World!"
Hello!
World!
Jay Bazuzi
quelle
2
RE: "lächerlich, dass sie entfernen würden" - Ich stelle mir PowerShell nicht gerne als "CMD mit entfernten dummen Teilen" vor. is.gd/k92B
Jay Bazuzi
89
Ich stelle mir PowerShell nicht gerne als "CMD mit entfernten dummen Teilen" vor. Ich stelle es mir gerne als "Bash ohne die nützlichen Teile" vor.
Pod
14
Sie können dies auch build ; if ($?) { run_tests }über die Befehlszeile tun .
docwhat
19
Der schnellste Weg zu wirklicher Frustration beim Erlernen von PowerShell besteht darin, zunächst zu denken, dass es sich nur um eine erweiterte CMD oder Bash handelt. Es hat ein grundlegend anderes Modell, insbesondere in Bezug auf Eingabe, Ausgabe, Rohrleitungen und Ergebnisse. Beginnen Sie mit einem guten Tutorial oder einer guten Übersicht und versuchen Sie nicht zu sehr, die Syntax anderer Shells zum Laufen zu bringen. Sie müssen es zu seinen eigenen Bedingungen nehmen.
Mark Meuer
3
Wie führe ich einen Befehl unter PowerShell aus und führe dann, wenn dieser Befehl erfolgreich ist, einen anderen Befehl aus, wenn dieser Befehl erfolgreich ist? Ich denke nicht, dass dies bashPowerShell Ideen auferlegt . Es ist die grundlegende Shell-Funktionalität. Bisher ist das Beste, was ich gesehen habe, build ; if ($?) { run_tests }das ich von nun an verwenden werde. Ich hoffe, das PowerShell-Team bietet &&Unterstützung!
Nate
28

&& und || waren auf der Liste der zu implementierenden Dinge (sind es noch), wurden jedoch nicht als die nächst nützlichste hinzuzufügende Sache angezeigt. Der Grund ist, dass wir -AND und -OR haben. Wenn Sie der Meinung sind, dass dies wichtig ist, reichen Sie bitte einen Vorschlag für Connect ein. Wir werden ihn für V3 in Betracht ziehen.

Jeffrey Snover - MSFT
quelle
11
Ich bin bei Connect angemeldet und habe mich für Powershell nominiert, kann aber nicht herausfinden, wie ich einen Vorschlag machen soll. Die Connect-Website ist wirklich komplex und verwirrend :-(
Orion Edwards
6
Ich konnte keine bereits vorhandene Anfrage finden und habe eine gestellt: connect.microsoft.com/PowerShell/feedback/details/778798/…
Andy Arismendi
22
Sie wissen, die Frage ist immer noch, wie man ein Äquivalent schreibt, und Ihre Antwort wäre viel nützlicher, wenn Sie ein Beispiel für die Verwendung -AND
hinzufügen würden
5
Dies ist wichtig, da es sich um ein grundlegendes Tool zur Flusskontrolle handelt, das fast ewig auf Systemen verwendet wird, die älter als Windows sind. Somit wird NOCH EIN ANDERER brechender Unterschied zwischen Linux und Windows dargestellt.
Airtonix
6
Ich hoffe, Jeffrey Snover hört zu, diese SO sollte Grund genug sein, sie jetzt zu implementieren. Es ist zu lange her und jetzt beginnt PowerShell an einigen Stellen zu erscheinen, so wie VSCode es als Standardterminal in Windows verwendet. Dies ist totaler Schmerz ohne &&, der -anddie Ausgabe frisst, überhaupt nicht gleichwertig.
Ciantic
13

Versuche dies:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
Ivan
quelle
9
Hinweis: Wenn der erste Befehl fehlschlägt, wird der zweite weiterhin ausgeführt.
BrunoLM
4
Die Präferenzvariable $ErrorActionPreferenceregelt nur, wie von Cmdlets gemeldete nicht terminierende Fehler behandelt werden. Externe Dienstprogramme wie cscund a.exemelden solche Fehler niemals (sie spiegeln nur ihren Exit-Status in $?(Erfolgsflag) und $LASTEXITCODE(den angegebenen spezifischen Exit-Code) wider ), sodass Ihre Befehlszeile der bedingungslosen Ausführung beider Befehle gleichkommt (das Äquivalent von cmd's csc /t:exe /out:a.exe SomeFile.cs & a.exe)
mklement0
5

Wenn Ihr Befehl in cmd.exe verfügbar ist (so etwas wie ein python ./script.pyPowerShell-Befehl wie ii .(dies bedeutet, dass das aktuelle Verzeichnis vom Explorer geöffnet wird)), können Sie cmd.exe in PowerShell ausführen. Die Syntax lautet wie folgt:

cmd /c "command1 && command2"

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

Tomoyuki Aota
quelle
4
Schön, aktualisieren Sie auf cmd, um auf die zusätzlichen Funktionen zuzugreifen.
Bill K
4

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)hat true zurückgegeben und (Get-Content $MyVar)auch true zurückgegeben .

Zweiter Test

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

($MyVar -ne $null)zurück falsch und so weit muss ich das übernehmen (Get-Content $MyVar)auch wieder falsch .

Der dritte Test bewies, dass der zweite Zustand nicht einmal analysiert wurde.

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

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

Cleber Machado
quelle
Du hast recht! Dies verhält sich wie der Operator &&. Selbst ein $ () auf der rechten Seite lässt dies nicht zu!
Falco Alexander
2

Sehr alte Frage, aber für die Neulinge: Vielleicht soll die PowerShell-Version (ähnlich, aber nicht gleichwertig ), nach der die Frage sucht, -andwie folgt verwendet werden:

(build_command) -and (run_tests_command)

Francisco Serrano
quelle
1
Dies mag für Ihren Anwendungsfall in Ordnung sein, verhält sich jedoch nicht so &&, dass der Exit-Code von ignoriert wird build_command.
Simon Buchan
Dies ist definitiv nicht das Richtige. Der zweite Befehl wird ausgeführt, auch wenn der erste fehlgeschlagen ist.
Nate
das ist völlig falsch. ;ist das Äquivalent zu &in cmd und ;in bash. Es ist definitiv nicht das gleiche wie &&in cmd
phuclv
Außerdem werden STDOUT und STDERR für beide Prozesse stummgeschaltet.
Dragas
0

Es hängt vom Kontext ab, aber hier ist ein Beispiel für "-und" in Aktion:

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

Damit werden alle Dateien größer als 10 KB in einem Verzeichnis, dessen Dateiname mit "f" beginnt.

Matt Hamilton
quelle
1
Dies ist keine Antwort auf die ursprüngliche Frage, bei der es um die Ausführung mehrerer Befehle geht.
Bdukes
0
if (start-process filename1.exe) {} else {start-process filename2.exe}

Es ist etwas länger als "&&", erreicht aber das Gleiche ohne Skripte und ist nicht allzu schwer zu merken. Besser spät als nie. :) :)

Lydell Anderson
quelle
2
Start-Processist das falsche Tool zum Aufrufen von Befehlszeilenprogrammen im Allgemeinen. Insbesondere hier verwendet wird , Start-Processläuft filename1.exeasynchron in einem neuen Konsolenfenster und kehrt nichts , die in einem Booleschen Kontext ausgewertet $false. Selbst wenn Sie weglassen Start-Process(wie Sie Befehlszeilen-Dienstprogramme direkt aufrufen sollten), würde der Ansatz zu kurz kommen, da das Ergebnis der Bedingung dann davon abhängt, ob das Dienstprogramm eine Standardausgabe erzeugt hat, die keine garantierte Beziehung zu dieser hat erfolgreich oder nicht.
mklement0
0

Ich denke, eine einfache if-Anweisung kann dies erreichen. Nachdem ich gesehen habe, dass die Antwort von mkelement0 über dem letzten Exit-Status in $? Gespeichert ist, habe ich Folgendes zusammengestellt:

# 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 Operation wäre es also:

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

Ein ausführliches Äquivalent ist zu kombinieren $LASTEXITCODEund -eq 0:

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

Ich bin mir nicht sicher, warum if ($?)es bei mir nicht funktioniert hat, aber dieser hat es getan.

TankorSmash
quelle
-1

Wir können diesen Befehl versuchen, anstatt die Methode && zu verwenden

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

Cyberiron
quelle
Es besteht keine Notwendigkeit für try/ catch, weil es nur für notwendig ist beendet Fehler, die externen Versorgungsleistungen wie hostname, ipconfigund findstrnicht auslösen können. Die Überprüfung $LASTEXITCODEist nur erforderlich, wenn Sie den von einem externen Dienstprogramm festgelegten spezifischen Exit-Code kennen möchten. Der Erfolg oder Misserfolg einer Zusammenfassung spiegelt sich $?ebenso wider wie bei nativen Cmdlets.
mklement0
Ich denke, @Cyberiron ist auf dem richtigen Weg. Ich denke, &&in Unix ist Try / Catch insofern sehr ähnlich, }als Sie nachfolgende Befehle nicht in einen neuen Block einschließen müssen (dh ), wenn Sie spätere Befehle kurzschließen (überspringen). Ich denke, eine AmpAmpFunktion / ein Filter, die wann auslöst, if (!?) { throw "last command failed" }wäre ein sehr nützlicher Ersatz für die Portierung &&auf PowerShell. Verwendung :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
Yzorg