Warum sollte man "Cmd / c Powershell" anstelle von "Powershell" verwenden?

25

Ich habe mein erstes Kontextmenü mithilfe der Registrierung gemäß den Anweisungen in dieser Frage hinzugefügt (yay me).

Ich habe dies ursprünglich als den Befehl verwendet, den es ausführt, dh den Wert der "Befehl" -Taste:

Cmd /C Powershell  "imageSeqView --% \"%1\""

ImageSeqViewist der Name meiner Powershell-Funktion, die ich in mein Powershell-Profil importiere. Es funktioniert gut, aber ich frage mich: Warum cmdzum Öffnen verwenden Powershell, um die Funktion auszuführen? Wäre es nicht einfacher, es einfach zu machen?

Powershell  "imageSeqView --% \"%1\""

Dieses Kommando scheint gut zu funktionieren, aber da es kanonisch erscheint, cmdfrage ich mich, ob es heimlich Welpen tötet oder so?

Bildbeschreibung hier eingeben

stib
quelle
2
Keine der Antworten in der verknüpften Frage verwendet cmd /c... cmd /kunterscheidet sich dahingehend, dass das Fenster nach Abschluss des Befehls geöffnet bleibt . Vermutlich hat der Fragesteller das so gemacht, damit er die Ausgabe zu Debug-Zwecken sehen konnte.
Bob
1
Es ist nicht so sehr der Modifikator, über den ich mich wundere, sondern die Verwendung cmd, die aus meiner Forschung allgegenwärtig zu sein scheint.
Stib
Können Sie eine Referenz angeben, die tatsächlich cmd /c powershellspeziell empfohlen wird ? Auch hier macht derjenige, den Sie verlinkt haben, keine solche Empfehlung.
Bob
3
Vermutlich handelt es sich hauptsächlich um Frachtkult. Es gibt einige Fälle, in denen dies erwünscht sein könnte (nämlich, wenn Sie cmd-Konstrukte wie Piping verwenden möchten), aber sie treffen nicht wirklich zu, wenn Sie dasselbe in Powershell tun können. In der MSDN-Dokumentation gibt es keine Hinweise darauf, dass dies erforderlich ist, obwohl die Dokumente zu den Dateizuordnungen eher spärlich sind.
Bob

Antworten:

29

Es gibt keinen guten Grund dafür. Tatsächlich ist der einzige wirkliche Effekt, der eintritt, die Verlangsamung.

Die Leute denken vielleicht, dass es einen guten Grund gibt, dies zu tun. Die Verwendung von CMD hat die folgenden Auswirkungen, die in einigen Fällen häufig hilfreich sein können:

  • Aktiviert interne Befehle wie " DIR"
  • Legt Umgebungsvariablen fest, z. B. die Variable PATH

In diesem Fall wird jedoch keiner dieser Vorteile erzielt. Schauen wir uns diese beiden Szenarien an:

Daher kann es in einigen Fällen eine Zeit geben, in der die Verwendung von " CMD /C" nützlich ist. Wenn ich beispielsweise den externen Befehl verwende PSEXEC(von SysInternals heruntergeladen) und versuche, " DIR" auf einem Remotecomputer auszuführen , wird Windows versuchen, den DIRBefehl " " auszuführen . Windows kann diesen Befehl nicht ausführen, da keine " DIR.EXE", " DIR.BAT" oder " DIR" Datei vorhanden ist, die mit einer anderen unterstützten Erweiterung endet. (Unterstützte Erweiterungen können durch Ausführen von " ECHO %PATHEXT%" angezeigt werden .)

Wenn ich in diesem Szenario jedoch versuche, " CMD /C DIR" auszuführen , funktioniert dies, da Windows nach einer ausführbaren Datei mit dem Namen " CMD" sucht und diese findet und anschließend CMDden DIRinternen Befehl erfolgreich ausführt Teil des CMDBefehls " ".

In diesem Fall können Sie genauso powershelleinfach wie " CMD /C powershell" ausführen , sodass Sie keinen Nutzen aus dem unnötigen " CMD /C" ziehen. Der einzige Vorteil, den ich sehe, wenn ich den zusätzlichen Schritt der Eingabe von " CMD /C" durchführe, ist die Angabe eines Beispiels, das nützlich ist, wenn jemand versucht, ein Beispiel zu ändern, um eine Befehlszeile " DIR" oder " COPY" auszuführen . Ein flexibleres Beispiel zu haben, kann für manche Menschen nützlich sein. Es ist wirklich nicht nötig, wenn die Leute wissen, was sie tun.

Was den zweiten Punkt betrifft, den ich angegeben habe, nämlich das Festlegen von Umgebungsvariablen, so tun Sie dies auch in diesem speziellen Fall nicht aktiv. Vielleicht denken einige Leute, dass sie helfen, indem sie dafür sorgen, dass die Umgebungsvariable PATH gesetzt wird. Wenn Sie jedoch Befehle direkt ausführen (z. B. über die Menüoption "Ausführen" des Startmenüs), sucht das Windows-Betriebssystem möglicherweise an einigen zusätzlichen Stellen nach Befehlen. In Windows XP / neuer können Sie beispielsweise Folgendes ausführen:

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"

Wenn der Befehl, den Sie ausführen möchten, unter "Anwendungspfade" aufgeführt ist, findet Windows das Programm möglicherweise auch dann, wenn es sich nicht im Pfad befindet. Windows wird wahrscheinlich sogar MEHR finden als nur das, was CMD in dem von CMD verwendeten PFAD finden würde.

Ein möglicher Vorteil ist, dass CMD so ausgeführt werden soll, dass auf eine Umgebungsvariable wie% USERPROFILE% oder% LOGONSERVER% oder% TEMP% /% TMP% verwiesen werden kann müssen " CMD /C" ausführen .

Für Ihren speziellen Fall gibt es also keinen guten Grund, dies zu tun. Die Effekte, die Sie erzielen, bestehen darin, dass Ihr Computer mehr Arbeit leistet, den Prozess verlangsamt und mehr Speicher verbraucht (und dies alles in vernachlässigbarem Umfang auf modernen Geräten).

TOOGAM
quelle
Ich bin mit dem Rat, den Bob gab, völlig einverstanden. Bob hat dich auf den richtigen Weg geführt. Während ich die Dinge las, dachte ich, dass einige weitere Informationen helfen könnten, ein bisschen mehr Klarheit zu schaffen.
TOOGAM
2
ftr - Das Starten eines Prozesses mit einer anderen Priorität ist ein guter Anwendungsfall für cmd /c. So etwas wie cmd /c start /low Notepad.exe.
Lieven Keersmaekers
Gute Antwort. Eine Sache, die ich erwähnt hätte, ist , dass hiermit auch die automatische Ausführung von cmd ausgeführt wird , dies ist jedoch normalerweise nicht festgelegt, und selbst wenn dies festgelegt ist, ist dies in einer Dateizuordnung wahrscheinlich nicht erwünscht. Und Lieven macht einen guten Punkt mit der Priorität, obwohl ich wieder denke, dass das für eine Dateizuordnung ein bisschen seltsam ist.
Bob
1
cmd selbst setzt keine Umgebungsvariablen. Die Umgebung wird vom übergeordneten Prozess geerbt. Das Hinzufügen von cmd dazwischen ändert daran nichts. App Paths wird meines Wissens nur für ShellExecute verwendet, nicht für CreateProcess. In den meisten Fällen (insbesondere in Shells) werden diese nicht angewendet (Sie können es selbst ausprobieren, es pbrushist ein App Path für mspaintund funktioniert nicht in viele Orte).
Joey
@Joey vielleicht richtiger zu sagen, es erweitert die Variablen ... aber wenn Sie es verwenden REG_EXPAND_SZ, können Sie Umgebungsvariablen erweitern (mit derselben %syntax%), ohne cmd aufzurufen. Die in Dateizuordnungen verwendeten Verben werden über aufgerufen ShellExecuteEx, sodass hier Anwendungspfade gelten.
Bob
18

Weil es die Färbung loswird.

Es kann sein, dass sie denken, dass die Leute den blauen Hintergrund als störend empfinden.

Mehrdad
quelle
1
Sie haben Windows nicht zur Hand, können aber nicht einfach die Hintergrundfarbe in den Konsoleneigenschaften festlegen?
Ruslan
1
Upvoting, obwohl es eine konkurrierende Antwort auf meine Frage ist, die darauf hindeutet, dass es keinen Grund gibt. Denn das ist ein vernünftiger Grund. Gut gemacht. Natürlich können einige Leute feststellen, dass die Black Box mehr ablenkt als die Blue Box. Dies ist jedoch eine Frage der Präferenz und die Leute können unterschiedliche Präferenzen haben, also +1 für eine gute und genaue Antwort. @ Rusland: Ja, aber können Sie es schaffen, diese Änderung vorzunehmen, bevor ein schnelles Programm verschwindet? (Und wissen Sie, ob Änderungen, die an einer Sitzung vorgenommen wurden, Auswirkungen auf andere Sitzungen haben. Unterscheiden sich die Einstellungen zwischen allgemeinen und speziellen Fällen wie Desktop-
Symbolen
Ich merke es nie, weil ich conEmu als Standardkonsole verwende, was bedeutet, dass ich immer mein schön konfiguriertes Konsolenfenster bekomme (mit ASCII-Grafiken und benutzerdefinierten Eingabeaufforderungen und Gifs von brennenden Fackeln. Lädt auch in weniger als 10 Minuten!)
stib
1

Mit cmd powershellfordern Sie die aktuelle Shell Explorer auf, cmd mit Parametern powershell, "imageSeqView ..."mit dem analysierten Wert% 1 bis cmd aufzurufen .

In diesem Fall "powershell"wird von cmd erwartet, dass es sich entweder um einen cmd-Befehl, eine exe oder ein von cmd unterstütztes Skript handelt, z. B. bat.

Mit powershell "imageSeqView ..."fordern Sie die aktuelle Shell Explorer auf, powershellmit Parametern imageSeqView ...mit dem analysierten Wert% 1 für Powershell aufzurufen.

" imageSeqView" In diesem Fall wird von Powershell erwartet, dass es sich entweder um ein Cmdlet, ein Exe- oder ein Powershell-Skript handelt.

Vorausgesetzt, " imageSeqView" ist eine Powershell-Funktion, ist der 1. Weg völlig unnötig und verringert die Leistung geringfügig.

Für Befehlsfensteroptionen gibt es ähnliche Optionen in Powershell wie -NoExit, die mit / K in cmd identisch sein sollten.

Beim Initialisieren von Umgebungsvariablen kann Powershell dasselbe tun.

chingNotCHing
quelle