Навіщо використовувати “Cmd / c Powershell” замість просто “Powershell”?


25

Я додав своє перше контекстне меню за допомогою реєстру згідно інструкцій, наведених у цьому питанні (так, мені).

Я спочатку використовував це як команду, яку вона виконує, тобто значення ключа "command":

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

ImageSeqViewце ім'я моєї функції повноважень, я імпортую її у свій профіль. Це добре працює, але мені цікаво: навіщо використовувати cmdдля відкриття Powershellдля виконання функції? Чи не було б простіше просто зробити

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

Ця команда, здається, працює просто чудово, але оскільки це здається канонічним для використання, cmdмені цікаво, це таємно вбивати цуценят чи щось таке?

введіть тут опис зображення


2
Жоден із відповідей у ​​використанні пов'язаного питання cmd /c... cmd /kне відрізняється тим, що він залишає вікно відкритим після завершення команди. Імовірно, запитувач зробив це так, щоб вони могли бачити вихід для налагодження.
Боб

1
Мені цікаво не стільки модифікатор, скільки це взагалі використання cmd, що, здається, є повсюдним у моїх дослідженнях.
стиг

Чи можете ви надати посилання, яке насправді рекомендує cmd /c powershellконкретно? Знову ж таки, той, кого ви пов’язали, не дає такої рекомендації.
Боб

тут прийнята відповідь: social.technet.microsoft.com/Forums/scriptcenter/en-US/…
стиб

3
За здогадкою, це, мабуть, переважно вантажні вантажі. Є кілька випадків, коли це може бути бажаним (а саме тоді, коли ви хочете використовувати cmd конструкції, такі як трубопроводи), але вони насправді не застосовуються, коли ви можете зробити те ж саме в повноваженнях. У документації MSDN немає нічого, що дозволяє сказати, що це необхідно, хоча документи, що оточують файлові асоціації, є досить рідкими.
Боб

Відповіді:


29

Немає вагомих причин для цього. Насправді єдиний реальний ефект, який відбувається - це сповільнити справи.

Люди можуть подумати, що для цього є вагомі причини. Використання CMD має такі ефекти, які в деяких випадках можуть бути хорошими:

  • Вмикає внутрішні команди, наприклад " DIR"
  • Встановлює змінні середовища, такі як змінна PATH

Однак у цьому випадку жодна з цих пільг не отримується. Давайте розглянемо обидва ці сценарії:

Отже, в деяких випадках може бути час, коли " CMD /C" корисно використовувати. Наприклад, якщо я використовую зовнішню команду PSEXEC(завантажену з SysInternals) і спробую запустити " DIR" на віддаленому комп'ютері, то Windows спробує запустити команду " DIR". Windows не зможе запустити цю команду, оскільки немає файлів " DIR.EXE", " DIR.BAT" або " DIR", що закінчується іншим підтримуваним розширенням. (Підтримувані розширення можна побачити, запустивши " ECHO %PATHEXT%".)

Однак у цьому сценарії, якщо я спробую запустити " CMD /C DIR", то це спрацює, тому що Windows шукатиме виконуваний файл з назвою " CMD", і знайде це, а потім CMDуспішно виконає DIRкоманду " ", яка є внутрішньою частина команди " CMD".

У цьому випадку ви можете просто powershellтак само легко працювати, як і " CMD /C powershell", тому ви не отримаєте ніякої користі від зайвого " CMD /C". Єдина користь, яку я бачу, щоб пройти додатковий крок набору тексту " CMD /C" - це надати приклад, який буде корисним, якщо хтось вирішить спробувати змінити приклад для запуску командного рядка " DIR" або " COPY". Маючи більш гнучкий приклад, може бути корисним для деяких людей. Це дійсно не потрібно, коли люди знають, що роблять.

Що стосується другого пункту, який я надавав, який полягає у встановленні змінних умов середовища, це теж щось, що ви не активно робите в цьому конкретному випадку. Можливо, деякі люди думають, що вони допомагають, викликаючи встановлення змінної середовища PATH. Однак, коли ви запускаєте команди безпосередньо (наприклад, з пункту меню «Виконати» меню «Пуск»), операційна система Windows може шукати команди в деяких додаткових місцях. Наприклад, у Windows XP / новіших версіях можна запустити:

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

Якщо команда, яку потрібно запустити, вказана у розділі "Шляхи додатків", Windows може знайти програму, навіть якщо вона не стоїть на шляху. Таким чином, Windows, ймовірно, знайде навіть БІЛЬШЕ, ніж лише те, що знайде CMD у PATH, який використовує CMD.

Однією з можливих переваг є те, якщо ви хотіли запустити CMD, щоб ви могли посилатися на змінну середовища, наприклад% USERPROFILE% або% LOGONSERVER% або% TEMP% /% TMP%, але оскільки ви цього не робите, ви не потрібно запустити " CMD /C".

Отже, для вашого конкретного випадку: Немає вагомих причин це робити. Ефекти, яких ви досягаєте, - це те, що ваш комп’ютер виконує більше роботи, уповільнюючи процес і використовуючи більше пам’яті (все це ви робите за рахунок незначної кількості сучасного обладнання).


Я повністю згоден з порадою, яку давав Боб. Боб вев вас правильним шляхом. Хоча я читав речі, я вважав, що трохи більше інформації може допомогти швидко надати чіткішу інформацію.
TOOGAM

2
ftr - запуск процесу з іншим пріоритетом є корисним випадком використання cmd /c. Щось подібне cmd /c start /low Notepad.exe.
Lieven Keersmaekers

Гарна відповідь. Я б уже зазначив, що це також працює автозапуск cmd , але це зазвичай не встановлюється, і навіть коли він встановлений, це, мабуть, не бажано в асоціації файлів. І Лівен добре підкреслює пріоритет, хоча знову ж таки я думаю, що це трохи дивно для асоціації файлів.
Боб

1
Сам cmd не встановлює змінних середовища. Середовище успадковується від батьківського процесу, додавання cmd між ними нічого не змінює. Шляхи додатків використовуються лише для ShellExecute, наскільки я знаю, не для CreateProcess, тому в більшості випадків (особливо в оболонках) це не застосовуватиметься (ви можете спробувати самостійно, pbrushце шлях до додатка mspaintі не працюватиме в багато місць).
Joey

@Joey, можливо, правильніше сказати, що вона розширює змінні ... але, подумайте про це, якщо ви використовуєте, REG_EXPAND_SZви можете розширити змінні середовища (використовуючи ті ж %syntax%), не викликаючи cmd. Дієслова, що використовуються у асоціаціях файлів, викликаються через ShellExecuteEx, тому тут застосовуються шляхи додатків.
Боб

18

Бо позбавляється від забарвлення.

Можливо, вони думають, що люди вважають, що синій фон відволікає.


1
У вас немає Windows під рукою, але чи не можете ви просто встановити колір фону у властивостях консолі?
Руслан

1
Оголошення, незважаючи на те, що на мою відповідь є конкурентоспроможною, що говорить про те, що немає причини. Бо це розумна причина. Хороша робота. Звичайно, деякі люди можуть вважати чорний ящик більш відволікаючим, ніж синій. Однак це питання переваги, і люди можуть мати різні вподобання, тому +1 для хорошої та точної відповіді. @Rusland: Так, але чи вдасться ви зробити цю зміну до того, як швидка програма зникне? (А чи знаєте ви, чи впливатимуть зміни, внесені до одного сеансу, на інші сеанси. Чи відрізнятимуться налаштування між загальними і конкретними випадками, такими як піктограми робочого столу?)
TOOGAM

Я ніколи цього не помічаю, тому що я використовую conEmu як консоль за замовчуванням, тобто я завжди отримую моє гарненько налаштоване вікно консолі (з мистецтвом ascii та спеціальними підказками та gifs запаленими смолоскипами. Вантажі теж менше 10 хвилин!)
стиб

1

З cmd powershell, ви попросите поточну оболонку, Explorer, викликати cmd з параметрами powershell, "imageSeqView ..."з проаналізованим значенням від% 1 до cmd.

У цьому випадку "powershell"cmd очікується, що це команда cmd, exe або один із підтримуваних скриптів cmd, наприклад, bat.

З powershell "imageSeqView ...", ви попросите поточну оболонку, провідник, викликати powershellпараметри imageSeqView ...з проаналізованим значенням% 1 до powershell.

У цьому випадку, " imageSeqView" очікується, що посилання shell може бути або командлетом, exe або скриптом повноважень.

За умови, що " imageSeqView" є функцією корпусу, перший спосіб абсолютно непотрібний і трохи знижує продуктивність.

Для параметрів вікон команд є аналогічні параметри в shellhell, такі як -NoExit, які повинні бути такими ж, як / K у cmd.

Для накладки труб, ініціалізації оточуючих середовищ, панцир може зробити однаково.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.