25

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

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

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

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

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

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

3 ответа3

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 найдет в ПУТИ, который использует CMD.

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

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

18

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

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

1

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

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

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

В этом случае, imageSeqView ожидаются PowerShell быть либо командлетом, ЕХ или скрипт Powershell.

При условии, что « imageSeqView » является функцией powershell, первый способ совершенно не нужен и немного снижает производительность.

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

Для выравнивания конвейера, инициализации переменных env, powershell может работать одинаково.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .