Зачем использовать «Cmd /c Powershell» вместо просто «Powershell»?

Зачем использовать «Cmd /c Powershell» вместо просто «Powershell»?

Я добавил свое первое контекстное меню с помощью реестра, следуя инструкциям, приведенным вэтот вопрос(Ура мне).

Первоначально я использовал это как команду, которую он выполняет, т.е. значение клавиши «command»:

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

ImageSeqViewэто имя моей функции powershell, я импортирую ее в свой профиль powershell. Работает отлично, но мне интересно: зачем использовать cmdto open Powershellдля выполнения функции? Не проще ли было бы просто сделать

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

Эта команда, кажется, работает отлично, но поскольку она кажется каноничной в использовании, cmdмне интересно, она тайно убивает щенков или что-то в этом роде?

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

решение1

Нет никаких веских причин делать это. Фактически, единственный реальный эффект, который происходит, — это замедление событий.

Люди могут подумать, что есть веская причина делать это. Использование 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"

Если команда, которую вы хотите запустить, указана в "App Paths", Windows может найти программу, даже если ее нет в пути. Таким образом, Windows, скорее всего, найдет даже БОЛЬШЕ, чем просто то, что CMD найдет в PATH, который использует CMD.

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

Итак, в вашем конкретном случае: нет никаких веских причин делать это. Эффект, которого вы добиваетесь, заключается в том, что ваш компьютер выполняет больше работы, замедляет процесс и использует больше памяти (все это вы делаете в незначительных количествах на современном оборудовании).

решение2

Потому что это избавляет от окраски.

Возможно, они думают, что синий фон отвлекает внимание людей.

решение3

С помощью cmd powershellвы просите текущую оболочку explorer вызвать cmd с параметрами powershell, "imageSeqView ..."с проанализированным значением %1 в cmd.

В этом случае "powershell"cmd ожидает, что это будет либо команда cmd, либо exe-файл, либо один из поддерживаемых cmd скриптов, например bat.

С помощью powershell "imageSeqView ..."вы просите текущую оболочку explorer вызвать powershell powershellс параметрами , содержащими проанализированное значение %1.imageSeqView ...

В этом случае imageSeqViewPowerShell ожидает, что « » будет либо командлетом, либо исполняемым файлом, либо скриптом PowerShell.

При условии, что " imageSeqView" — это функция PowerShell, 1-й способ совершенно не нужен и немного снижает производительность.

Для параметров командного окна существуют аналогичные параметры в PowerShell, такие как -NoExit, который должен быть таким же, как /K в cmd.

Для конвейеризации и инициализации переменных окружения PowerShell может сделать то же самое.

Связанный контент