4

Я просто создал элемент контекстного меню "Открыть PowerShell Here", добавив ключи "shell", "powershell" и "command" в соответствующее место в реестре Windows. Значением по умолчанию "command" был путь к моему powershell.exe с использованием обратной косой черты в качестве escape-символа вместо того, чтобы заключать весь путь в двойные кавычки.

Это привело к тому, что окна cmd были открыты с выполнением powershell, то есть окно было маленьким, черным и иначе отформатировано в стиле командной строки по умолчанию.
Когда я изменил путь, чтобы не было обратной косой черты в качестве escape-символов, а вместо этого заключить весь путь в двойные кавычки, не внося никаких других изменений, как обычно, вместо этого открылось обычное, большее, синее окно PowerShell.

Мне интересно, какие изменения вносят двойные кавычки в реестр? Как они изменяют исполнение в этом случае и почему?

Ключи, о которых идет речь:
C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe
а также
"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe"

Первый ключ открывает стандартное черное окно командной строки с запущенной PowerShell, а второй - знакомое синее окно "PowerShell".

Обратите внимание, что ключ для запуска Powershell в определенной папке имеет аргументы в конце, которые здесь намеренно опущены, так как это ключи, которые я тестировал и которые дают разные результаты.

1 ответ1

2

Вы ничего не избежите в первом сценарии; новый процесс создается с полной командной строкой C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe , в точности так, как вы ее указали. (Проверено с помощью Process Explorer.)

Windows хранит информацию о стиле консоли - цвета, шрифт, размер окна - в HKCU\Console . Когда программа консольного режима (то есть один , который производит свой собственный conhost.exe экземпляра) запускаются, Windows проверяет подраздел Console с именем полного пути к EXE программы, с переменным окружением в пути разрушился (смотрите примечание) и с \ заменено на _ . (Если это не удастся, Windows проверит подключ с таким именем без \ замены, но редактор реестра не позволит вам включить \ в имя ключа. Проверено с помощью Process Monitor.)

Примечание: "Свертывание" (по отношению к переменным среды) - это просто мое слово для противоположности "расширения". Расширение - это процесс замены переменных среды, таких как %SystemRoot% их значениями (например, C:\Windows в этом случае). Похоже, что Windows сворачивает значения в переменные среды, когда это возможно, до обращения к ключу консоли, поэтому C:\Windows заменяется на %SystemRoot% .

Обычно Windows находит настройки PowerShell в подразделе с именем %SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe . Но поскольку путь к программе содержит дополнительные обратные слеши - которые Windows прощает, но не очищает, по крайней мере, в этом случае - она не находит никаких специальных настроек консоли, потому что нет подходящего подключа. Когда я установил свой пункт контекстного меню для запуска C:\Windows\system32\WindowsPowerShell\v1.0\\powershell.exe (обратите внимание на последний \ doubled) и переименовал реальный подраздел в %SystemRoot%_System32_WindowsPowerShell_v1.0__powershell.exe (обратите внимание на последний _ удвоился), запущенный экземпляр PowerShell получил стиль.

Кроме того: экземпляры PowerShell, запускаемые путем ввода powershell в существующей командной строке, никогда не получают специальные стили, потому что они подключены к консоли своего родителя, который обычно имеет скучные стили по умолчанию. Это явление не имеет отношения к вышесказанному.

Дальнейшее чтение: хороший ответ Джея Базузи, в котором упоминается о нескольких местах, из которых может прийти стиль.

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