Как использовать Cmder в коде Visual Studio?

На работе существует политика безопасности предприятия, в которой всем исполняемым файлам разрешено работать только C:\Program Files или C:\Program Files (x86).

В коде Visual Studio в settings.json, используя следующие настройки:

{
    "terminal.integrated.shell.windows": "C:\\Windows\\Sysnative\\cmd.exe",
    "terminal.integrated.shellArgs.windows": [
        "/k C:\\Program Files (x86)\\Cmder\\vendor\\init.bat"
    ]
}

... при инициализации для интегрированного терминала, я получаю следующее сообщение об ошибке:

'C:\Program' is not recognized as an internal or external command, 
operable program or batch file.

Из-за удивительного соглашения об именах файлов и каталогов Windows, позволяющего пробелы, трудно указать один из путей Program File.

VSCode не нравится, когда вы избегаете символа пробела, и этот код дает мне ошибку Invalid escape character in string. Когда я пытаюсь изменить свойство на это:

{
    ...
    "terminal.integrated.shellArgs.windows": [
        "/k C:\\Program\ Files\ (x86)\\Cmder\\vendor\\init.bat"
    ]
}

... Появляется следующее сообщение об ошибке:

'C:\ProgramFiles' is not recognized as an internal or external command,
operable program or batch file.

Наконец, пытаясь окружить путь в кавычках следующим образом:

{
    ...
    "terminal.integrated.shellArgs.windows": [
        "/k \"C:\\Program Files (x86)\\Cmder\\vendor\\init.bat\""
    ]
}

... дает мне это сообщение об ошибке:

'\"C:\Program Files (x86)\Cmder\vendor\init.bat\""' is not recognized as an 
internal or external command,
operable program or batch file.

Есть ли способ интегрировать Cmder в VSCode?

Ответ 1

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

В Windows существует команда /X для команды dir, которая гласит:

  /X          This displays the short names generated for non-8dot3 file
              names.  The format is that of /N with the short name inserted
              before the long name. If no short name is present, blanks are
              displayed in its place.

Итак, выполнение команды dir /X на C:\ отображает следующее:

C:\>dir /X
 Volume in drive C is OSDisk
 Volume Serial Number is XXXX-XXXX

 Directory of C:\

...
08/17/2017  08:02 PM    <DIR>          PROGRA~1     Program Files
08/09/2017  03:58 PM    <DIR>          PROGRA~2     Program Files (x86)
...

Вы можете использовать краткое имя каталога PROGRA~2 для замены Program Files (x86) и иметь следующие настройки в settings.json для кода VS:

{
    "terminal.integrated.shell.windows": "C:\\Windows\\Sysnative\\cmd.exe",
    "terminal.integrated.shellArgs.windows": [
        "/k C:\\PROGRA~2\\Cmder\\vendor\\init.bat"
    ]
}

Что загружает Cmder успешно в интегрированном терминале:

Изображение Cmder успешно загружено в интегрированный терминал VS Code.

Ответ 2

Другое решение - вы можете установить местоположение cmder на новый путь.

image was from nikrolls when giving the solution

и просто установить в вашем settings.json

"terminal.integrated.shell.windows": "C:\\Windows\\system32\\cmd.exe",
"terminal.integrated.shellArgs.windows": [
    "/k %CMDER_ROOT%\\vendor\\init.bat"
]

вы можете найти его на cmder github.

Ответ 3

Другой подход.

Команда Cmder предлагает использовать символ ^ перед каждым пробелом на вашем пути, вместо того, чтобы использовать метод именования 8dot3.

Пример:

{
    "terminal.integrated.shell.windows": "C:\\Windows\\Sysnative\\cmd.exe",
    "terminal.integrated.shellArgs.windows": [
        "/k C:\\Program Files^ (x86)\\Cmder\\vendor\\init.bat"
    ]
}


Взято из официальной вики Cmder:

Пространства в пути

ВНИМАНИЕ. Интерпретатор командной строки в Windows имеет некоторые проблемы с пробелами в пути, например C:\Program Files (x86)\Cmder. Мы не рекомендуем устанавливать Cmder в пути, содержащем пробелы.

Вместо этого мы рекомендуем устанавливать Cmder по пути, который не содержит пробелов, таких как: C:\apps\Cmder или C:\tools\Cmder чтобы избежать любых конфликтов с кодом VS.

Если вам по какой-то причине действительно нужно запустить Cmder из пути с пробелами, вам может понадобиться добавлять символ ^ перед каждым пробелом, так что C:\\Example Directory for Test\\Cmder станет C:\\Example^ Directory^ for^ Test\\Cmder в вашем файле settings.json.

Ответ 4

Это работает для меня. Мой корневой каталог Cmder: D:\soft\cmder, внимание ваше!

"terminal.integrated.env.windows": {"CMDER_ROOT": "D:\\soft\\cmder"},
"terminal.integrated.shellArgs.windows": ["/k D:\\soft\\cmder\\vendor\\init.bat"],

Добавьте его в настройки VSCode. наслаждайтесь!

Ответ 5

https://github.com/cmderdev/cmder/wiki/Seamless-VS-Code-Integration

 "terminal.integrated.shell.windows": "cmd.exe",

  "terminal.integrated.env.windows": {
  "CMDER_ROOT": "[cmder_root]"
  },
  "terminal.integrated.shellArgs.windows": [
    "/k [cmder_root]\\vendor\\init.bat"
  ],

Замените оба [cmder_root] на ваш каталог установки Cmder.

второе решение

"terminal.integrated.shell.windows": "C:\\Program Files\\cmder\\vendor\\git-for-windows\\bin\\bash.exe",

Ответ 6

Очень простое решение (источник):

Создайте файл в корне папки vscode.bat со следующим кодом.

@echo off
SET CMDER_ROOT=C:\cmder <--your path to cmder
"%CMDER_ROOT%\vendor\init.bat"

Затем в настройках vscode добавьте следующее в файл settings.json:

"terminal.integrated.shell.windows": "C:\\WINDOWS\\sysnative\\cmd.exe",
 "terminal.integrated.shellArgs.windows": ["/K", "C:\\cmder\\vscode.bat"] <-- your path

Вы также можете легко переключаться между cmd и cmder, комментируя и cmder "terminal.integrated.shellArgs.windows".

Ответ 7

Лучшее решение, которое я нашел: Быстро и просто.

"terminal.external.windowsExec": "C:\\Utils\\Cmder\\Cmder.exe",
"terminal.integrated.shell.windows": "C:\\WINDOWS\\sysnative\\cmd.exe"
"terminal.integrated.shellArgs.windows" : ["/K","C:\\Utils\\cmder\\vendor\\init.bat"],

Ответ 8

Это решение хорошо работает на открытом терминале, но прерывает вызовы cmd, запускаемые через плагины, с такими аргументами, как npm build-lint и т.д.

Решение, чтобы исправить это, состоит в том, чтобы создать собственный init.bat, который оборачивает эти вызовы и ссылается на него на sellArgs.

settings.json

"terminal.integrated.shell.windows": "cmd.exe",
"terminal.integrated.shellArgs.windows": [
    "/K C:\\SoftDev\\App\\Cmder\\vendor\\vstudio.bat"
],

C:\SoftDev\App\cmder\vendor\vstudio.bat

@echo off
if "%1" == "" (
    C:\SoftDev\App\cmder\vendor\init.bat
) else (
    cmd %1 %2 %3 %4 %5 %6 %7 %8 %9
    exit
)