Почему cmd с переключателем /c не работает из адресной строки проводника, как ожидалось, при закрытии окна консоли после запуска VS Code?

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

Сначала я открываю cmd, набирая cmd в адресной строке каталога, который хочу открыть в Visual Studio Code. Я пытался найти прямой путь.

Я пробовал использовать cmd /c code . и cmd /c "code .". Это открывает мою папку в VS Code, но проблема в том, что cmd не закрывается.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование cmd.exe вообще не обязательно. Его можно запустить напрямую %LOCALAPPDATA%\Programs\Microsoft VS Code\bin\code.exe с текущим путем к каталогу в качестве аргумента, поскольку его можно прочитать на странице интерфейса командной строки кода Visual Studio.

Используемый метод приводит к explorer.exe вызову функции библиотеки ядра Windows CreateProcess для запуска cmd.exe с тремя аргументами /c и code и ..

В справке по запуску cmd /? в окне командной строки объясняется, что параметр /c дает команду командному процессору Windows проанализировать и запустить командную строку, как указано далее, с оставшимися аргументами, а затем закрыться.

code — имя исполняемого файла для запуска без пути и расширения.

В данном случае . ссылается на текущий рабочий каталог cmd.exe. См. документацию Microsoft о Именовании файлов, путей и пространств имен, где также объясняется . как относительный путь для ссылки на текущий каталог.

По этой причине командный процессор Windows вызывает CreateProcess для выполнения code.exe после того, как обнаружил его с помощью переменных среды PATH и PATHEXT, как описано в этом ответе подробно с . в качестве аргумента для code.exe и ждет с самозакрытием, пока не запустится code.exe закрывается. Здесь такое ожидание нежелательно. Решение состоит в том, чтобы вообще не использовать совершенно ненужный cmd.exe только для того, чтобы сделать то, что explorer.exe уже можно сделать: вызвать CreateProcess для запуска code.exe с путем к каталогу в качестве аргумента.

ПРИМЕЧАНИЕ. В приведенном ниже описании предполагается установка Visual Studio Code в каталог %LOCALAPPDATA%\Programs\Microsoft VS Code, который является каталогом установки по умолчанию. Замените этот путь к каталогу путем к каталогу установки Visual Studio Code, если установка выполнялась в другой каталог.

Использование ярлыка файла в папке «Отправить»/контекстном меню

Одним из решений является использование ярлыка файла в папке/контекстном меню Send to для запуска кода Visual Studio с указанием пути к каталогу или имени файла, который можно настроить следующим образом.

Запустите проводник Windows и перейдите в каталог %LOCALAPPDATA%\Programs\Microsoft VS Code\bin. Это также можно сделать, выбрав этот путь к каталогу здесь, в веб-браузере, скопировав его с помощью Ctrl+C в буфер обмена, щелкните адресную строку проводника Windows, вставьте путь с помощью Ctrl+V и нажмите клавишу RETURN или ENTER, чтобы открыть этот каталог. .

Нажмите дополнительную (обычно правую) кнопку указывающего устройства (мыши) на файле code.exe, чтобы открыть контекстное меню для исполняемого файла Visual Studio Code.

Нажмите основной (обычно левой) кнопкой манипулятора на элемент «Показать дополнительные параметры в Windows 11» и нажмите «Далее» в любой Windows в подменю «Отправить» в пункте контекстного меню «Рабочий стол» (создать ярлык). Затем сверните окно проводника Windows, чтобы увидеть рабочий стол с новым файлом ярлыка с именем code.exe или code.exe - Shortcut в зависимости от версии Windows. Также можно нажать комбинацию клавиш Win+D (нажать клавишу с логотипом Windows и удерживать клавишу плюс D) для отображения рабочего стола. Win+D повторное нажатие восстанавливает окна приложения. См. также страницу документации Microsoft Сочетания клавиш в Windows.

Нажмите кнопку вторичного указывающего устройства на вновь созданном файле ярлыка и (после нажатия «Показать дополнительные параметры в Windows 11») щелкните пункт контекстного меню «Переименовать», чтобы изменить имя файла ярлыка на что-то значимое, например «Открыть в VS Code». Имя файла ярлыка позже будет именем пункта контекстного меню в контекстном подменю Отправить.

Нажать кнопку вторичного манипулятора на вновь созданном и уже переименованном файле ярлыка и нажать на пункт контекстного меню Свойства, чтобы открыть диалоговое окно Свойства ярлыка.

Свойство Target передается с параметром функции lpCommandLine в CreateProcess пользователем explorer.exe позже с помощью ярлыка. Его можно изменить, добавив такие параметры, как --new-window (с предшествующим пробелом). Важно знать, что explorer.exe при дальнейшем использовании ярлыка добавляет к командной строке пробел и полное имя каталога/файла каталога/файла, выбранного в настоящее время в проводнике Windows, как определено свойством Target.

Путь к каталогу, указанный свойством Start in, передается с параметром функции lpCurrentDirectory в CreateProcess и определяет текущий рабочий каталог для запущенного исполняемого файла code.exe. В этом случае лучше всего указать в свойствах ярлыка «Начало» без пути. Тогда текущий рабочий каталог explorer.exe будет также текущим рабочим каталогом Visual Studio Code. Но в качестве начала можно также использовать каталог программных файлов Visual Studio Code.

Свойство «Комментарий» должно быть настроено с полезной подсказкой, например «Открыть каталог или файл в Visual Studio Code».

Можно выбрать красивый значок, отображаемый позже в контекстном подменю «Отправить», и, конечно же, все остальные свойства также можно настроить. Все они определяют, как explorer.exe вызывает CreateProcess при использовании ярлыка. Наконец, нажмите кнопку ОК, чтобы сохранить все измененные свойства и закрыть окно.

Вырежьте измененный файл ярлыка с помощью Ctrl+X с рабочего стола, восстановите окно проводника Windows, перейдите в каталог %APPDATA%\Microsoft\Windows\SendTo и вставьте с помощью Ctrl+V файл ярлыка.

Теперь в проводнике Windows (или любом другом файловом менеджере с поддержкой контекстного меню проводника) можно открыть контекстное меню каталога или файла с помощью кнопки вторичного указательного устройства и (после нажатия кнопки «Показать дополнительные параметры в Windows 11») щелкнуть в подменю «Отправить». в пункт контекстного меню с именем файла ярлыка, например «Открыть в VS Code». Затем explorer.exe (или любой другой исполняемый файл файлового менеджера) запускает Visual Studio Code с полным именем (диск + путь + имя + расширение) каталога/файла, выбранного в данный момент в файловом менеджере, добавленного в качестве дополнительного аргумента.

Пункт контекстного меню «Отправить в» Открыть в VS Code можно удалить после удаления Visual Studio Code, удалив ярлык с этим именем файла в каталоге %APPDATA%\Microsoft\Windows\SendTo.

Использование зарегистрированного пункта открытого контекстного меню для каталогов

Другим решением является регистрация пункта контекстного меню «Открыть в VS Code» для каталогов в реестре Windows, чтобы непосредственно в контекстном меню каталога/папки был пункт контекстного меню «Открыть в VS Code». Это можно сделать из окна командной строки , выполнив следующие команды:

reg.exe ADD "HKCU\Software\Classes\Directory\shell\Open in VS Code" /v Icon /d "%LOCALAPPDATA%\Programs\Microsoft VS Code\bin\code.exe,0" /f
reg.exe ADD "HKCU\Software\Classes\Directory\shell\Open in VS Code" /v MultiSelectModel /d Single /f
reg.exe ADD "HKCU\Software\Classes\Directory\shell\Open in VS Code\command" /ve /d ^"\"%LOCALAPPDATA%\Programs\Microsoft VS Code\bin\code.exe\" \"%1\"^" /f

Дополнительную информацию см. на странице документации Microsoft Создание обработчиков контекстного меню. Запустите в окне командной строки reg.exe QUERY HKCR\Directory /s, чтобы получить вывод всех существующих зарегистрированных действий оболочки и обработчиков контекстного меню, эффективных для текущего пользователя.

Если щелкнуть сейчас в проводнике Windows или любом другом файловом менеджере с поддержкой зарегистрированных расширений оболочки Windows и обработчиков контекстного меню в каталоге с кнопкой вторичного указывающего устройства, откроется контекстное меню для выбранного каталога, содержащее (после нажатия кнопки «Показать дополнительные параметры» в Windows 11). ) пункт контекстного меню Открыть в VS Code.

Первый значок в ресурсах значков code.exe Visual Studio Code используется здесь в качестве значка для отображения в контекстном меню. Также можно зарегистрировать другой значок из ресурсов значков code.exe, изменив число после запятой или любого другого файла, содержащего ресурс значка.

Значение строки реестра с именем MultiSelectModel и значением Single гарантирует, что опция контекстного меню «Открыть в VS Code» будет отображаться только в том случае, если в файловом менеджере выбран один каталог. Этот параметр контекстного меню не отображается, если в файловом менеджере выбрано несколько каталогов, поскольку невозможно запустить Visual Studio Code с несколькими аргументами каталога. Это преимущество этого решения по сравнению с решением «Отправить по ярлыку», поскольку выполнение кода Visual Studio по ошибке с несколькими выбранными каталогами теперь невозможно.

%1 заменяется полным именем выбранного каталога.

Также могут быть параметры VS Code, такие как --new-window, вставленные в командную строку слева от \"%1\" при регистрации command для открытия в VS Code.

После удаления Visual Studio Code можно выполнить следующую команду в окне командной строки, чтобы удалить из реестра пункт контекстного меню «Открыть в VS Code»:

reg.exe DELETE "HKCU\Software\Classes\Directory\shell\Open in VS Code"

Дополнительная информация относительно регистрации оболочки

Оболочка Windows — это приложение, которое показывает пользователю после входа в систему рабочий стол Windows, кнопку/меню «Пуск» Windows и панель задач Windows с системным треем. В реестре Windows под ключом HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon хранится строковое значение реестра с именем Shell со строковым значением explorer.exe по умолчанию. Первый запускается explorer.exe после того, как пользователь вошел в систему, и по этой причине по умолчанию работает как оболочка Windows. Также можно использовать другой исполняемый файл в качестве оболочки Windows. Но этот исполняемый файл должен поддерживать все, что поддерживается explorer.exe для работы в качестве оболочки Windows.

Я также хочу добавить информацию о разнице между Directory и Folder в HKEY_CLASSES_ROOT , который представляет собой объединенное представление 64-битных и 32-битных HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes. Дополнительную информацию см. также на странице документации Microsoft Ключи реестра, на которые влияет WOW64.

В окне командной строки reg.exe QUERY HKCR\Folder /s можно выполнить команду, чтобы получить информацию о регистрации Folder как действующей для текущего пользователя.

Directory предназначен только для реальных каталогов файловой системы.

Folder включает в себя реальные каталоги в файловой системе, а также виртуальные папки, такие как Home или Gallery и другие, отображаемые в проводнике Windows. Home не является настоящим каталогом в файловой системе. Это виртуальная папка с идентификатором {F874310E-B6B7-47DC-BC84-B9E6B38F5903}.

Регистрация Open в VS Code под ключом Folder вместо Directory приведет к тому, что этот пункт контекстного меню будет отображаться также в контекстном меню Home с выполнением кода Visual Studio с "::{F874310E-B6B7-47DC-BC84-B9E6B38F5903}" в качестве аргумента при нажатии на пункт контекстного меню. Это, конечно, было бы бесполезно, поскольку Visual Studio Code не знает, что делать с этой строкой аргумента. Это причина добавления Open in VS Code к Directory, а не к Folder.

Другие вопросы по теме