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

25

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

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

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

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

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

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

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

STIB
источник
2
Ни один из ответов в использовании связанного вопроса cmd /c... cmd /kне отличается тем, что оставляет окно открытым после завершения команды. Предположительно, аскер сделал это таким образом, чтобы они могли видеть выходные данные в целях отладки.
Боб
1
Меня интересует не столько модификатор, сколько cmdвообще его использование, что, как мне кажется, повсеместно в моих исследованиях.
17
Можете ли вы предоставить ссылку, которая действительно рекомендует cmd /c powershellконкретно? Опять же, тот, кого вы связали, не дает такой рекомендации.
Боб
принятый ответ здесь: social.technet.microsoft.com/Forums/scriptcenter/en-US/…
17
3
По-видимому, это в основном грузовое культирование. Есть несколько случаев, когда это может быть желательно (а именно, когда вы хотите использовать конструкции cmd, такие как конвейерная обработка), но они на самом деле не применяются, когда вы можете сделать то же самое в powershell в любом случае. В документации 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 найдет в ПУТИ, который использует CMD.

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

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

TOOGAM
источник
Я полностью согласен с советом, который давал Боб. Боб вел тебя по правильному пути. Однако когда я читал что-то, я подумал, что некоторая дополнительная информация поможет быстрее прояснить ситуацию.
TOOGAM
2
ftr - хороший запуск для запуска процесса с другим приоритетом cmd /c. Нечто подобное cmd /c start /low Notepad.exe.
Ливен Керсмакерс
Хороший ответ. Одна вещь , которую я бы упомянул это также работает CMD игровая автозапуск , но это , как правило , не устанавливается, и даже тогда , когда оно установлено , что это , вероятно , не требуется в файле ассоциации. И Ливен подчеркивает приоритетность, хотя, опять же, я думаю, что это немного странно для ассоциации файлов.
Боб
1
Сам cmd не устанавливает переменные окружения. Среда наследуется от родительского процесса, добавление cmd между ними ничего не меняет. Пути к приложениям используются только для ShellExecute, насколько я знаю, но не для CreateProcess, поэтому в большинстве случаев (особенно в оболочках) они не применяются (вы можете попробовать сами, pbrushэто путь к приложению mspaintи не будет работать в много мест).
Джои
@Joey, возможно, более правильно сказать, что он расширяет переменные ... но если подумать, если вы используете, REG_EXPAND_SZвы можете расширять переменные окружения (используя то же самое %syntax%), не вызывая cmd. Глаголы, используемые в ассоциациях файлов, вызываются через ShellExecuteEx, поэтому пути к приложениям здесь применимы.
Боб
18

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

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

Mehrdad
источник
1
У вас под рукой нет Windows, но вы не можете просто установить цвет фона в свойствах консоли?
Руслан
1
Upvoting, несмотря на то, что я являюсь конкурирующим ответом на мой вопрос, который предполагает, что нет причин. Потому что это разумная причина. Отличная работа. Конечно, некоторые люди могут найти черный ящик более отвлекающим, чем синий ящик. Однако это вопрос предпочтений, и у людей могут быть разные предпочтения, поэтому +1 за хороший и точный ответ. @Rusland: Да, но сможете ли вы сделать это изменение до того, как исчезнет быстрая программа? (И знаете ли вы, будут ли изменения, внесенные в один сеанс, влиять на другие сеансы. Будут ли отличаться настройки для общих случаев и конкретных случаев, таких как значки на рабочем столе?)
TOOGAM
Я никогда не замечаю этого, потому что я использую conEmu в качестве консоли по умолчанию, а это означает, что я всегда получаю свое прекрасно сконфигурированное окно консоли (с ascii art и пользовательскими подсказками и изображениями горящих факелов. Загрузка также происходит менее чем за 10 минут!)
stib
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, 1-й способ совершенно не нужен и немного снижает производительность.

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

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

chingNotCHing
источник