Perché usare "Cmd / c Powershell" invece di "Powershell"?


25

Ho aggiunto il mio primo menu contestuale usando il registro secondo le istruzioni fornite in questa domanda (yay me).

Inizialmente l'ho usato come comando che esegue, ovvero il valore del tasto "comando":

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

ImageSeqViewè il nome della mia funzione PowerShell, lo importazione nel mio profilo PowerShell. Funziona bene, ma mi chiedo: perché usare cmdper aprire Powershellper eseguire la funzione? Non sarebbe più semplice farlo

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

Quel comando sembra funzionare bene, ma dal momento che sembra canonico da usare, cmdmi chiedo se sta segretamente uccidendo i cuccioli o qualcosa del genere?

inserisci qui la descrizione dell'immagine


2
Nessuna delle risposte nella domanda collegata usa cmd /c... cmd /kè piuttosto diversa in quanto lascia la finestra aperta dopo il completamento del comando. Presumibilmente il richiedente ha fatto in questo modo in modo da poter vedere l'output a scopo di debug.
Bob

1
Non è tanto il modificatore di cui mi chiedo, è l'uso di cmdtutto, che sembra essere onnipresente dalla mia ricerca.
Stib

Potete fornire un riferimento che in realtà raccomanda cmd /c powershellspecificamente? Ancora una volta, quello che hai collegato non fa tale raccomandazione.
Bob


3
Probabilmente si tratta principalmente di culto del carico. Ci sono alcuni casi in cui questo potrebbe essere desiderato (vale a dire, quando si desidera utilizzare costrutti cmd come piping), ma non si applicano realmente quando si può fare lo stesso in PowerShell comunque. Non c'è nulla nella documentazione di MSDN che suggerisca che ciò sia necessario, sebbene i documenti che circondano le associazioni di file siano piuttosto scarsi.
Bob

Risposte:


29

Non c'è una buona ragione per farlo. In effetti, l'unico vero effetto che accade è rallentare le cose.

La gente potrebbe pensare che ci sia una buona ragione per farlo. L'uso di CMD ha i seguenti effetti che possono essere generalmente buoni in alcuni casi:

  • Abilita i comandi interni, come " DIR"
  • Imposta le variabili di ambiente, come la variabile PATH

Tuttavia, in questo caso, nessuno di questi benefici è ottenuto. Diamo un'occhiata a entrambi questi scenari:

Quindi, in alcuni casi, può esserci un momento in cui l'uso di " CMD /C" è utile. Ad esempio, se utilizzo il comando esterno PSEXEC(scaricato da SysInternals) e provo a eseguire " DIR" su un computer remoto, Windows proverà a eseguire il DIRcomando " ". Windows non eseguirà quel comando poiché non esiste un file " DIR.EXE", " DIR.BAT" o " DIR" che termina con un'altra estensione supportata. (Le estensioni supportate possono essere visualizzate eseguendo " ECHO %PATHEXT%".)

Tuttavia, in questo scenario, se provo a eseguire " CMD /C DIR", allora funzionerà, perché Windows cercherà un eseguibile chiamato " CMD" e lo troverà, quindi CMDfinirà per eseguire correttamente il DIRcomando " " che è un comando interno parte del CMDcomando " ".

In questo caso, puoi eseguire powershellsemplicemente " CMD /C powershell", quindi non trarrai alcun vantaggio dal " CMD /C" non necessario . L'unico vantaggio che sto vedendo durante la fase aggiuntiva della digitazione " CMD /C" è di fornire un esempio che sarà utile se qualcuno decide di provare a modificare un esempio per eseguire una riga di comando " DIR" o " COPY". Avere un esempio più flessibile può essere utile per alcune persone. Non è davvero necessario quando le persone sanno cosa stanno facendo.

Per quanto riguarda il secondo punto elenco che ho fornito, che è quello di impostare le variabili di ambiente, è anche qualcosa che non stai facendo attivamente in questo caso particolare. Forse alcune persone pensano che stiano aiutando le cose causando l'impostazione della variabile d'ambiente PATH. Tuttavia, quando si eseguono comandi direttamente (ad es. Dall'opzione di menu "Esegui" del menu Start), il sistema operativo Windows può cercare comandi in alcuni punti aggiuntivi. Ad esempio, in Windows XP / versioni successive è possibile eseguire:

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

Se il comando che si desidera eseguire è elencato in "Percorsi app", Windows potrebbe trovare il programma anche se non si trova nel percorso. Quindi, è probabile che Windows trovi MOLTO di più di quello che CMD troverebbe nel PERCORSO utilizzato da CMD.

Un possibile vantaggio è se si desidera eseguire CMD in modo da poter fare riferimento a una variabile di ambiente come% USERPROFILE% o% LOGONSERVER% o% TEMP% /% TMP%, ma poiché non lo si sta facendo, non lo è necessità di eseguire " CMD /C".

Quindi, per il tuo caso particolare: non c'è una buona ragione per farlo. Gli effetti che stai ottenendo sono far lavorare di più il tuo computer, rallentare il processo e consumare più memoria (tutto ciò che stai facendo con quantità trascurabili su apparecchiature moderne).


Sono pienamente d'accordo con il consiglio che Bob stava dando. Bob ti stava guidando lungo la strada giusta. Mentre leggevo le cose, tuttavia, ho pensato che alcune ulteriori informazioni potrebbero aiutare a fornire un po 'più di chiarezza rapidamente.
TOOGAM,

2
ftr - avviare un processo con una priorità diversa è un buon esempio per cmd /c. Qualcosa del genere cmd /c start /low Notepad.exe.
Lieven Keersmaekers,

Buona risposta. Una cosa che avrei menzionato è che esegue anche l'esecuzione automatica di cmd , ma di solito non è impostata, e anche quando è impostata probabilmente non è desiderata in un'associazione di file. E Lieven fa un buon punto con la priorità, anche se penso che sia un po 'strano per un'associazione di file.
Bob

1
cmd stesso non imposta le variabili di ambiente. L'ambiente è ereditato dal processo parent, l'aggiunta di cmd in mezzo non cambia nulla al riguardo. Percorsi app è usato solo per ShellExecute, per quanto ne so, non per CreateProcess, quindi nella maggior parte dei casi (specialmente nelle shell) quelli non si applicano (puoi provarlo tu stesso, pbrushè un percorso app mspainte non funziona in molti posti).
Joey,

@Joey forse più corretto nel dire che espande le variabili ... ma, a pensarci bene, se lo usi REG_EXPAND_SZpuoi espandere le variabili di ambiente (usando le stesse %syntax%) senza invocare cmd. I verbi utilizzati nelle associazioni di file vengono richiamati tramite ShellExecuteEx, quindi qui vengono applicati i percorsi app.
Bob

18

Perché si sbarazza della colorazione.

Può essere che pensano che le persone trovino lo sfondo blu che distrae.


1
Non hai Windows a portata di mano, ma non puoi semplicemente impostare il colore di sfondo nelle proprietà della console?
Ruslan,

1
La votazione, nonostante sia una risposta contrastante alla mia, il che suggerisce che non c'è motivo. Perché, questa è una ragione ragionevole. Buon lavoro. Certo, alcune persone potrebbero scoprire che la scatola nera è più fonte di distrazione rispetto alla scatola blu. Tuttavia, questa è una questione di preferenza e le persone possono avere preferenze diverse, quindi +1 per una risposta buona e accurata. @Rusland: Sì, ma riesci a fare quel cambiamento prima che scompaia un programma veloce? (E sai se le modifiche apportate a una sessione influiranno su altre sessioni. Le impostazioni differiranno tra casi generali e specifici come le icone del desktop?)
TOOGAM

Non me ne accorgo mai perché uso conEmu come mia console predefinita, il che significa che ottengo sempre la mia finestra della console ben configurata (con arte ASCII e suggerimenti personalizzati e gif di torce accese. Carica anche in meno di 10 minuti!)
stib

1

Con cmd powershell, chiedi alla shell corrente, explorer, di invocare cmd con parametri powershell, "imageSeqView ..."con valore analizzato da% 1 a cmd.

In questo caso, "powershell"si prevede che cmd sia un comando cmd, un exe o uno degli script supportati da cmd, ad esempio bat.

Con powershell "imageSeqView ...", chiedi alla shell corrente, explorer, di invocare powershellcon parametri imageSeqView ...con valore analizzato di% 1 su PowerShell.

In questo caso, " imageSeqView" prevede che PowerShell sia un cmdlet, un exe o uno script PowerShell.

A condizione che " imageSeqView" sia una funzione PowerShell, il primo modo è completamente inutile e riduce leggermente le prestazioni.

Per le opzioni della finestra di comando, ci sono opzioni simili in PowerShell come -NoExit, che dovrebbe essere uguale a / K in cmd.

Per il rivestimento dei tubi, l'inizializzazione di vari ambienti, PowerShell può fare altrettanto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.