Dlaczego warto korzystać z „Cmd / c Powershell” zamiast po prostu „Powershell”?

25

Dodałem moje pierwsze menu kontekstowe za pomocą rejestru zgodnie z instrukcjami podanymi w tym pytaniu (tak, ja).

Pierwotnie użyłem tego jako polecenia, które wykonuje, tj. Wartości klawisza „polecenie”:

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

ImageSeqViewto nazwa mojej funkcji PowerShell, importuję ją do mojego profilu PowerShell. Działa dobrze, ale zastanawiam się: cmdpo co otwierać w Powershellcelu wykonania funkcji? Czy nie byłoby łatwiej po prostu to zrobić

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

To polecenie wydaje się działać dobrze, ale skoro wydaje się kanoniczne cmd, zastanawiam się, czy potajemnie zabija szczenięta czy coś takiego?

wprowadź opis zdjęcia tutaj

dźgnięcie
źródło
2
Żadna z odpowiedzi w łączonym użyciu pytania cmd /c... cmd /knie różni się tym, że pozostawia otwarte okno po zakończeniu polecenia. Prawdopodobnie pytający zrobił to w ten sposób, aby mogli zobaczyć dane wyjściowe do celów debugowania.
Bob
1
Zastanawiam się nie tyle o modyfikatorze, ile o zastosowaniu cmd, które wydaje się wszechobecne w moich badaniach.
stib
Czy możesz podać referencje, które faktycznie cmd /c powershellszczególnie polecają ? Znowu ten, który podłączyłeś, nie zawiera takich zaleceń.
Bob
zaakceptowana odpowiedź tutaj: social.technet.microsoft.com/Forums/scriptcenter/en-US/…
stib
3
Domyślam się, że to głównie hodowla ładunków. Jest kilka przypadków, w których może to być pożądane (mianowicie, gdy chcesz użyć konstrukcji cmd, takich jak piping), ale tak naprawdę nie mają zastosowania, gdy i tak możesz zrobić to samo w PowerShell. W dokumentacji MSDN nie ma nic, co sugerowałoby, że jest to konieczne, chociaż dokumenty otaczające skojarzenia plików są raczej rzadkie.
Bob

Odpowiedzi:

29

Nie ma dobrego powodu, aby to zrobić. W rzeczywistości jedynym prawdziwym efektem jest spowolnienie.

Ludzie mogą myśleć, że istnieje dobry powód, aby to zrobić. Korzystanie z CMD ma następujące efekty, które zwykle mogą być dobre w niektórych przypadkach:

  • Włącza wewnętrzne polecenia, takie jak „ DIR
  • Ustawia zmienne środowiskowe, takie jak zmienna PATH

Jednak w tym przypadku nie uzyskuje się żadnej z tych korzyści. Spójrzmy na oba te scenariusze:

Dlatego w niektórych przypadkach może być czas, kiedy użycie „ CMD /C” jest przydatne. Na przykład, jeśli PSEXECużyję zewnętrznego polecenia (pobranego z SysInternals) i spróbuję uruchomić „ DIR” na komputerze zdalnym, wtedy Windows spróbuje uruchomić polecenie „ DIR”. System Windows nie uruchomi tego polecenia, ponieważ nie ma pliku „ DIR.EXE”, „ DIR.BAT” lub „ DIR” kończącego się innym obsługiwanym rozszerzeniem. (Obsługiwane rozszerzenia można zobaczyć, uruchamiając „ ECHO %PATHEXT%”.)

Jednak w tym scenariuszu, jeśli spróbuję uruchomić „ CMD /C DIR”, to zadziała, ponieważ system Windows wyszuka plik wykonywalny o nazwie „ CMD” i znajdzie go, a następnie CMDpomyślnie uruchomi polecenie „ DIR”, które jest wewnętrznym część CMDpolecenia „ ”.

W takim przypadku możesz uruchomić powershelltak łatwo, jak „ CMD /C powershell”, więc nie zyskujesz na niepotrzebnym „ CMD /C”. Jedyną korzyścią, jaką widzę, przechodząc przez dodatkowy etap pisania „ CMD /C”, jest podanie przykładu, który będzie przydatny, jeśli ktoś zdecyduje się zmodyfikować przykład, aby uruchomić wiersz polecenia „ DIR” lub „ COPY”. Bardziej elastyczny przykład może być przydatny dla niektórych osób. To naprawdę nie jest potrzebne, gdy ludzie wiedzą, co robią.

Jeśli chodzi o drugi punkt, który podałem, który polega na ustawianiu zmiennych środowiskowych, jest to również coś, czego nie aktywnie robisz w tym konkretnym przypadku. Być może niektórzy ludzie myślą, że pomagają, powodując ustawienie zmiennej środowiskowej PATH. Jednak po uruchomieniu poleceń bezpośrednio (np. Z opcji menu „Uruchom” w menu Start) system operacyjny Windows może szukać poleceń w niektórych dodatkowych miejscach. Na przykład w systemie Windows XP / nowszym możesz uruchomić:

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

Jeśli polecenie, które chcesz uruchomić, znajduje się na liście „Ścieżki aplikacji”, system Windows może znaleźć program, nawet jeśli nie znajduje się on na ścieżce. Tak więc Windows prawdopodobnie znajdzie WIĘCEJ niż tylko to, co CMD znajdzie w ŚCIEŻCE, której używa CMD.

Jedną z możliwych korzyści jest to, że chcesz uruchomić CMD, abyś mógł odwoływać się do zmiennej środowiskowej, takiej jak% USERPROFILE% lub% LOGONSERVER% lub% TEMP% /% TMP%, ale ponieważ tego nie robisz, nie jesteś trzeba uruchomić „ CMD /C”.

Tak więc w twoim konkretnym przypadku: nie ma dobrego powodu, aby to zrobić. Osiągane efekty to większa wydajność pracy komputera, spowolnienie procesu i zużycie pamięci (wszystko to w niewielkim stopniu na nowoczesnym sprzęcie).

TOOGAM
źródło
Całkowicie zgadzam się z radą udzieloną przez Boba. Bob prowadził cię właściwą ścieżką. Kiedy czytałem różne rzeczy, pomyślałem, że więcej informacji może pomóc w szybszym uzyskaniu większej przejrzystości.
TOOGAM
2
ftr - dobrym pomysłem jest rozpoczęcie procesu o innym priorytecie cmd /c. Coś jak cmd /c start /low Notepad.exe.
Lieven Keersmaekers
Dobra odpowiedź. Jedną rzeczą, o której wspomniałbym, jest to, że uruchamia także autorun cmd , ale zwykle nie jest to ustawione, a nawet gdy jest ustawione, prawdopodobnie nie jest pożądane w powiązaniu plików. Lieven ma rację, jeśli chodzi o priorytet, choć myślę, że to trochę dziwne jak na skojarzenie plików.
Bob
1
Sam cmd nie ustawia zmiennych środowiskowych. Środowisko jest dziedziczone z procesu nadrzędnego, dodanie cmd pomiędzy nimi nic nie zmienia. O ile mi wiadomo, ścieżki aplikacji są używane tylko w ShellExecute, a nie w CreateProcess, więc w większości przypadków (szczególnie w powłokach) te nie będą miały zastosowania (możesz spróbować sam, pbrushjest to ścieżka aplikacji mspainti nie będzie działać w wiele miejsc).
Joey,
@Joey może bardziej poprawne jest stwierdzenie, że rozszerza zmienne ... ale pomyśl o tym, jeśli używasz REG_EXPAND_SZ, możesz rozszerzać zmienne środowiskowe (używając tego samego %syntax%) bez wywoływania cmd. Czasowniki używane w powiązaniach plików są wywoływane przez ShellExecuteEx, więc tutaj obowiązują ścieżki aplikacji.
Bob
18

Ponieważ pozbywa się zabarwienia.

Może być tak, że ludzie uważają, że niebieskie tło rozprasza.

Mehrdad
źródło
1
Nie masz pod ręką systemu Windows, ale czy nie możesz po prostu ustawić koloru tła we właściwościach konsoli?
Ruslan
1
Upvoting, mimo że jest konkurencyjną odpowiedzią na moją, co sugeruje, że nie ma powodu. Ponieważ jest to rozsądny powód. Dobra robota. Oczywiście niektórzy ludzie mogą uznać, że czarna skrzynka jest bardziej rozpraszająca niż niebieska skrzynka. Jest to jednak kwestia preferencji i ludzie mogą mieć różne preferencje, więc +1 za dobrą i dokładną odpowiedź. @Rosland: Tak, ale czy zdołasz wprowadzić tę zmianę, zanim zniknie szybki program? (I czy wiesz, czy zmiany wprowadzone w jednej sesji wpłyną na inne sesje. Czy ustawienia będą się różnić między ogólnymi przypadkami a konkretnymi, takimi jak ikony na pulpicie?)
TOOGAM
Nigdy tego nie zauważam, ponieważ używam conEmu jako domyślnej konsoli, co oznacza, że ​​zawsze otrzymuję ładnie skonfigurowane okno konsoli (z grafiką ascii oraz niestandardowymi monitami i gifami płonących pochodni. Ładuje się również w czasie
krótszym
1

Za pomocą cmd powershellpytasz bieżącą powłokę, eksploratora, aby wywołała cmd z parametrami powershell, "imageSeqView ..."o przeanalizowanej wartości% 1 do cmd.

W tym przypadku "powershell"cmd oczekuje, że będzie to polecenie cmd, exe lub jeden ze obsługiwanych skryptów cmd, np. Bat.

Za pomocą powershell "imageSeqView ..."pytasz bieżącą powłokę, eksploratora, aby wywołała powershellz parametrem imageSeqView ...o przeanalizowanej wartości% 1 do PowerShell.

W takim przypadku „ imageSeqView” oczekuje się, że PowerShell będzie poleceniem cmdlet, exe lub skryptem PowerShell.

Pod warunkiem, że „ imageSeqView” jest funkcją PowerShell, pierwszy sposób jest całkowicie niepotrzebny i nieznacznie obniża wydajność.

Dla opcji okna poleceń istnieją podobne opcje w PowerShell, takie jak -NoExit, które powinny być takie same jak / K w cmd.

W przypadku wykładania rur, inicjowania zmiennych środowiska env, PowerShell może zrobić to samo.

chingNotCHing
źródło