Wsl не является внутренней или внешней командой для исполняемой программы или пакетного файла

Обновлено: 21.11.2024

Для начала мы хотели бы извиниться за то, что вы читаете этот документ вместо того, чтобы хорошо провести время, используя встроенный терминал в Visual Studio Code. Команда VS Code усердно работает над тем, чтобы сделать работу с терминалом максимально удобной, но в некоторых случаях возникают проблемы с оболочкой или конфигурациями терминала, с которыми редактор VS Code не может справиться.

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

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

Если вы новичок в использовании интегрированного терминала VS Code, вы можете узнать больше в руководстве пользователя встроенного терминала. Там вы можете прочитать, как настроить терминал, а также ознакомиться с ответами на распространенные вопросы.

Ниже приведены конкретные шаги по устранению неполадок, если руководство пользователя не помогло вам диагностировать сбой при запуске. Шаги по устранению неполадок, такие как проверка настроек и включение ведения журнала, применимы ко всем платформам, поддерживающим VS Code; macOS, Linux и Windows.

Примечание. Если вы работаете в Windows, вы можете сначала просмотреть раздел "Часто встречающиеся проблемы в Windows".

Этапы устранения неполадок

Чтобы устранить сбои при запуске встроенного терминала в Visual Studio Code, выполните следующие действия для диагностики проблем:

Проверьте настройки пользователя. Просмотрите эти параметры terminal.integrated, которые могут повлиять на запуск:

  • терминал.интегрированная.оболочка. - Путь к оболочке, которую использует терминал.
  • terminal.integrated.shellArgs. - Аргументы командной строки при запуске процесса оболочки.
  • terminal.integrated.cwd — текущий рабочий каталог (cwd) для процесса оболочки.
  • terminal.integrated.env. - Переменные среды, которые будут добавлены в процесс оболочки.
  • terminal.integrated.inheritEnv — должны ли новые оболочки наследовать свою среду от VS Code.
  • terminal.integrated.automationShell. - Путь оболочки для использования терминала, связанного с автоматизацией, например задач и отладки.
  • terminal.integrated.splitCwd — управляет текущим рабочим каталогом, с которого начинается разделенный терминал.
  • terminal.integrated.windowsEnableConpty — следует ли использовать ConPTY для связи процесса терминала Windows.

Вы можете просмотреть настройки в редакторе настроек (Файл > Настройки > Настройки) и выполнить поиск определенных настроек по идентификатору настройки.

Быстрый способ проверить, не изменились ли вы настройки, о которых вы могли не знать, — использовать фильтр @modified в редакторе настроек.

Большинство настроек интегрированного терминала необходимо изменить непосредственно в JSON-файле user settings.json. Вы можете открыть settings.json с помощью ссылки Edit in settings.json в редакторе настроек или с помощью команды Preferences: Open Settings (JSON) из палитры команд ( ⇧⌘P (Windows, Linux Ctrl+Shift+P )).< /p>

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

Используйте самую последнюю версию VS Code. Каждый ежемесячный выпуск VS Code содержит множество обновлений и исправлений и может включать встроенные улучшения терминала. Вы можете проверить свою версию VS Code через Help > About (в macOS Code > About Visual Studio Code). Чтобы найти последнюю версию VS Code, перейдите к примечаниям к выпуску VS Code. Вы также можете проверить, установлена ​​ли у вас последняя версия оболочки.

Используйте самую последнюю версию оболочки. Если ваша оболочка установлена ​​отдельно от вашей платформы, попробуйте установить последнюю доступную версию оболочки. Тот же совет применим, если вы используете более старую сборку операционной системы. Например, некоторые старые версии Windows 10 плохо работали с терминалом VS Code.

Включить ведение журнала трассировки.Вы можете включить ведение журнала трассировки и записывать журнал при запуске терминала. Ведение журнала часто показывает, что не так, поскольку все аргументы, используемые для создания терминального процесса/pty, записываются. Неправильные имена оболочки, аргументы или переменные среды могут привести к тому, что терминал не запустится. Сохраните этот журнал на потом, если ваша проблема не будет решена.

Дополнительные шаги по устранению неполадок

Если ни один из этих шагов не помог решить проблему, вы также можете попробовать:

  • Спросите об этом в Stack Overflow. Зачастую проблемы с запуском связаны с настройкой среды, а не с VS Code.
  • Если терминал запускается из расширения, сообщите о проблеме расширению, открыв средство создания отчетов о проблемах (Справка > Сообщить о проблеме) и задав для параметра File On = "Расширение"
  • Если вы считаете, что это ошибка в VS Code, сообщите о проблеме с помощью средства создания отчетов о проблемах (Справка > Сообщить о проблеме). Репортер о проблемах автоматически заполнит соответствующую информацию. Дополнительные сведения о том, что включить в отчет, см. в разделе Создание отличных проблем терминала.
  • Если вы используете Windows 10 1809 (сборка 17763) или более ранней версии, проблема связана с устаревшей серверной частью winpty. При обновлении до Windows 1903 (сборка 18362) вы перейдете на новую серверную часть conpty, созданную Microsoft, и это может решить вашу проблему.

Коды выхода

Коды выхода, отображаемые в уведомлении об ошибке запуска терминала, возвращаются из процесса оболочки и не генерируются VS Code. Существует множество доступных оболочек, которые можно использовать в терминале, и сотни возможных кодов выхода.

Распространенные проблемы в Windows

Убедитесь, что режим совместимости отключен

При обновлении до Windows 10 для некоторых приложений режим совместимости может включаться автоматически. Когда это происходит с VS Code, терминал ломается, поскольку он выполняет некоторые действия низкого уровня, чтобы включить эмуляцию, которую он использует. Вы можете проверить и отключить режим совместимости, щелкнув правой кнопкой мыши исполняемый файл VS Code и выбрав свойства, а затем снимите флажок «Выполнить эту программу в режиме совместимости» на вкладке совместимости.

Терминал завершил работу с кодом 1 в Windows 10 (с WSL в качестве оболочки по умолчанию)

Это может произойти, если для подсистемы Windows для Linux (WSL) не настроен допустимый дистрибутив Linux по умолчанию.

Примечание. "docker-desktop-data" не является допустимым дистрибутивом.

  • Откройте PowerShell и введите wslconfig.exe /l, чтобы убедиться, что WSL установлен правильно, и перечислите доступные в настоящее время дистрибутивы Linux в вашей системе. Убедитесь, что рядом с действительным дистрибутивом стоит (по умолчанию).
  • Чтобы изменить дистрибутив по умолчанию, введите wslconfig.exe /setdefault "distributionNameAsShownInList"

Терминал не работает при запуске 32-битного клиента Windows в 64-битной Windows?

Эту проблему легко решить, используя 64-разрядную версию. Если вы должны использовать 32-разрядную версию, вам нужно использовать путь sysnative при настройке пути оболочки вместо System32. Добавление этого параметра должно решить проблему:

Произошло собственное исключение

Обычно эта ошибка возникает из-за того, что антивирусное программное обеспечение перехватывает и блокирует создание терминального процесса компонентами winpty/conpty. Чтобы обойти эту ошибку, вы можете исключить из антивирусной проверки следующий файл:

Сообщение об этой проблеме команде антивирусного ПО также может помочь полностью устранить проблему.

Вы должны использовать Windows 10 версии 2004 и выше (сборка 19041 и выше) или Windows 11.

Чтобы проверить версию и номер сборки Windows, нажмите клавишу с логотипом Windows + R, введите winver и выберите ОК. Вы можете выполнить обновление до последней версии Windows, выбрав «Пуск» > «Параметры» > «Центр обновления Windows» > «Проверить наличие обновлений».

Если вы используете более старую сборку или просто предпочитаете не использовать команду установки и хотите получить пошаговые инструкции, см. инструкции по ручной установке WSL для более старых версий.

Установить

Теперь вы можете установить все необходимое для запуска подсистемы Windows для Linux (WSL), введя эту команду в PowerShell администратора или в командной строке Windows, а затем перезагрузив компьютер.

Эта команда активирует необходимые дополнительные компоненты, загрузит последнюю версию ядра Linux, установит WSL 2 по умолчанию и установит для вас дистрибутив Linux (по умолчанию Ubuntu, см. ниже, чтобы изменить это) .

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

Приведенная выше команда работает только в том случае, если WSL вообще не установлен. Если вы запустите wsl --install и увидите текст справки WSL, попробуйте запустить wsl --list --online, чтобы увидеть список доступных дистрибутивов, и запустите wsl --install -d для установки дистрибутива.

Изменить установленный дистрибутив Linux по умолчанию

По умолчанию установленным дистрибутивом Linux будет Ubuntu. Это можно изменить с помощью флага -d.

  • Чтобы изменить установленный дистрибутив, введите: wsl --install -d . Замените на название дистрибутива, который вы хотите установить.
  • Чтобы просмотреть список доступных дистрибутивов Linux, доступных для загрузки в интернет-магазине, введите: wsl --list --online или wsl -l -o .
  • Чтобы установить дополнительные дистрибутивы Linux после первоначальной установки, вы также можете использовать команду: wsl --install -d .

Если вы хотите установить дополнительные дистрибутивы из командной строки Linux/Bash (а не из PowerShell или командной строки), вы должны использовать .exe в команде: wsl.exe --install -d или перечислить доступные дистрибутивы. : wsl.exe -l -o .

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

Настройте информацию о пользователе Linux

После установки WSL вам потребуется создать учетную запись пользователя и пароль для только что установленного дистрибутива Linux. Дополнительные сведения см. в руководстве "Рекомендации по настройке среды разработки WSL".

Настройка и рекомендации

Мы рекомендуем следовать нашим рекомендациям по настройке руководства по среде разработки WSL, чтобы получить пошаговое руководство по настройке имени пользователя и пароля для установленных дистрибутивов Linux с помощью основных команд WSL. , установка и настройка Windows Terminal, настройка контроля версий Git, редактирование и отладка кода с использованием удаленного сервера VS Code, рекомендации по хранению файлов, настройка базы данных, подключение внешнего диска, настройка ускорения графического процессора и многое другое.< /p>

Проверьте, какую версию WSL вы используете

Вы можете просмотреть список установленных дистрибутивов Linux и проверить версию WSL, установленную для каждого из них, введя команду: wsl -l -v в PowerShell или командной строке Windows.

Чтобы установить версию по умолчанию на WSL 1 или WSL 2 при установке нового дистрибутива Linux, используйте команду: wsl --set-default-version , заменив ее на 1 или 2.

Чтобы установить дистрибутив Linux по умолчанию, используемый с командой wsl, введите: wsl -s или wsl --setdefault , заменив на имя дистрибутива Linux, который вы хотите использовать. Например, в PowerShell/CMD введите: wsl -s Debian, чтобы установить Debian в качестве дистрибутива по умолчанию. Теперь запуск wsl npm init из Powershell запустит команду npm init в Debian.

Чтобы запустить конкретный дистрибутив wsl из PowerShell или командной строки Windows без изменения дистрибутива по умолчанию, используйте команду: wsl -d , заменив ее именем дистрибутива, который вы хотите использовать.

Подробнее читайте в руководстве по основным командам для WSL.

Обновить версию с WSL 1 до WSL 2

Чтобы обновить WSL 1 до WSL 2 в ранее установленных дистрибутивах Linux, используйте команду: wsl --set-version 2, заменив ее на имя дистрибутива Linux, который вы хотите обновить. Например, wsl --set-version Ubuntu-20.04 2 настроит ваш дистрибутив Ubuntu 20.04 на использование WSL 2. Вам также может потребоваться включить дополнительный компонент виртуальной машины, используемый WSL 2, и установить пакет ядра, если вы еще этого не сделали. сделано так.

Новые установки Linux по умолчанию будут настроены на WSL 2, но с помощью команды wsl --set-version можно также перейти с WSL 2 на WSL 1. Чтобы узнать, настроен ли ваш дистрибутив Linux на WSL 1 или WSL 2, используйте команду: wsl -l -v .

Чтобы узнать больше, см. Справочник по командам для WSL для получения списка команд WSL, Сравнение WSL 1 и WSL 2 для получения рекомендаций по использованию в вашем рабочем сценарии или Рекомендации по настройке среды разработки WSL для общих рекомендаций. по настройке рабочего процесса разработки с помощью WSL.

Способы запуска нескольких дистрибутивов Linux с помощью WSL

WSL поддерживает запуск любого количества различных дистрибутивов Linux, которое вы хотите установить. Это может включать выбор дистрибутивов из Microsoft Store, импорт пользовательского дистрибутива или создание собственного пользовательского дистрибутива.

Существует несколько способов запуска установленных дистрибутивов Linux:

    (Рекомендуется) Использование терминала Windows поддерживает столько командных строк, сколько вы хотите установить, и позволяет вам открывать их на нескольких вкладках или панелях окон и быстро переключаться между несколькими дистрибутивами Linux или другими командными строками (PowerShell, Командная строка, PowerShell, Azure CLI и т. д.). Вы можете полностью настроить свой терминал с помощью уникальных цветовых схем, стилей шрифтов, размеров, фоновых изображений и пользовательских сочетаний клавиш. Узнать больше.
  1. Вы можете напрямую открыть свой дистрибутив Linux, посетив меню "Пуск" Windows и введя название установленных дистрибутивов. Например: «Убунту». Это откроет Ubuntu в собственном окне консоли.
  2. В командной строке Windows или PowerShell вы можете ввести имя установленного дистрибутива. Например: убунту
  3. Из командной строки Windows или PowerShell вы можете открыть дистрибутив Linux по умолчанию внутри текущей командной строки, введя: wsl.exe .
  4. Из командной строки Windows или PowerShell вы можете использовать дистрибутив Linux по умолчанию внутри текущей командной строки, не вводя новый, введя: wsl [команда] . Замена [command] на команду WSL, например: wsl -l -v, чтобы вывести список установленных дистрибутивов, или wsl pwd, чтобы увидеть, где смонтирован текущий путь к каталогу в wsl. В PowerShell команда get-date предоставит дату из файловой системы Windows, а wsl date предоставит дату из файловой системы Linux.

Выбор метода должен зависеть от того, что вы делаете. Если вы открыли командную строку WSL в Windows Prompt или окне PowerShell и хотите выйти, введите команду: exit .

Хотите попробовать новейшие функции предварительного просмотра WSL?

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

Я хочу использовать пакетный сценарий для запуска Docker в подсистеме Windows для Linux при входе в систему. Он работает, когда я запускаю командный файл от имени администратора. Поэтому я следовал этому руководству: всегда запускать пакетный файл от имени администратора в Windows 10

Затем я поместил ярлык в папку автозагрузки. Скрипт запускается, но завершается всегда на первой строке.

Затем я попытался вручную запустить пакетный файл в FreeCommander. Пакетный скрипт работает, когда я запускаю скрипт от имени администратора через пункт контекстного меню, щелкнув правой кнопкой мыши. Но выводится сообщение об ошибке, когда я запускаю пакетный скрипт двойным щелчком. Выходное сообщение об ошибке:

Команда "wsl" написана с ошибкой или не может быть найдена.

Это пакетный скрипт:

Я также один раз полностью удалил подсистему Windows для Linux и переустановил ее, но проблема не устранена.

@Myrkjartan это потому, что вы используете 32-разрядный браузер. Выбросьте его и используйте вместо него 64-битный, или по какой-то причине вы не можете этого сделать, тогда используйте C:\Windows\SysNative, который перенаправляет в настоящую папку system32: Executable "C:\Windows\System32\Fodhelper.exe " не найдено, Дженкинс: запускайте пакетные команды Windows в 32-разрядном режиме

1 Ответ 1

Сначала следует прочитать следующие страницы документации Microsoft:

  1. %SystemRoot%\System32 с 64-разрядными приложениями, используемыми 64-разрядными приложениями по умолчанию.
  2. %SystemRoot%\SysWOW64 с 32-разрядными приложениями, используемыми 32-разрядными приложениями по умолчанию.

Переменная системной среды PATH по умолчанию содержит %SystemRoot%\System32 в качестве первого пути к папке. Если 32-разрядное приложение запускает cmd.exe для обработки пакетного файла, запускается 32-разрядный %SystemRoot%\SysWOW64\cmd.exe из-за перенаправителя файловой системы.

cmd.exe ищет файлы, указанные в пакетном файле, только с именем файла без расширения файла или с расширением файла и без пути, используя локальные переменные среды PATHEXT и PATH, как подробно описано в разделе «Почему X является не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл"?

wsl.exe относится к набору исполняемых файлов, которые в AMD64 Windows существуют только как 64-битная версия в %SystemRoot%\System32 . В %SystemRoot%\SysWOW64 нет 32-битной версии, которую ищет 32-битный cmd.exe при использовании %SystemRoot%\System32 в развернутом виде в локальном PATH из-за перенаправителя файловой системы. По этой причине пакетный файл, опубликованный в вопросе, не работает при обработке 32-разрядным cmd.exe в Windows x64.

Решение принимает во внимание WOW64 с дополнительным кодом в пакетном файле:

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

Краткое описание
Я понимаю, что это может не иметь ничего общего с BashOnWindows, но я нигде не смог найти ничего по этой теме через Google/Bing. Мой Bash в Windows на самом деле работает просто отлично, что очень сбивает с толку, так это то, что я не могу запустить bash.exe или LxRun.exe из командной строки Windows (cmd.exe) или PowerShell.

Я вижу оба файла в проводнике в папке C:\Windows\System32 и могу запустить bash.exe оттуда, но когда я пытаюсь запустить bash.exe или LxRun.exe из командной строки, я просто могу 'т. Я не могу перечислить файлы (с «dir» в cmd.exe или «ls -al» в PowerShell), и если я попытаюсь выполнить их напрямую, мне сообщат, что эти файлы не существуют. Все остальное в System32 (и где угодно еще в этом отношении), похоже, ведет себя так, как ожидалось.

Фактические результаты (с выходными данными терминала, если применимо)
'C:\Windows\System32\bash.exe' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.
'C:\Windows\System32\LxRun.exe' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.

Номер сборки Windows
14393.187

Шаги/все команды, необходимые для воспроизведения ошибки при новой установке

  1. Включить WSL
  2. Открыть командную строку (cmd.exe)
  3. Попробуйте запустить "C:\Windows\System32\LxRun.exe /install"

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

✔️Ответ принят

Для тех, кто столкнется с этой проблемой.

Если вы, как и я, не можете найти bash и lxrun в PATH или где-либо еще с помощью командной строки, попробуйте выполнить
echo %PROCESSOR_ARCHITECTURE%
Если вы получите 'x86' ( ака 32-разрядная), то у вас та же проблема, что и у меня: вы просто используете неправильную версию cmd.exe

И вот почему

Ubuntu для Windows требуется 64-разрядная версия Windows, поэтому я предполагаю, что вы работаете с 64-разрядной версией Windows. Здесь 64-разрядные системные двоичные файлы расположены в «C:\Windows\System32», а 32-разрядные версии (тех двоичных файлов, которые имеют 32-разрядный эквивалент) находятся в «C:\Windows\SysWOW64». «WOW64» означает «Windows [32-разрядная] в Windows 64 [-разрядная], которая представляет собой технологию, которая позволяет вам запускать 32-разрядные приложения в 64-разрядной ОС в первую очередь. Если это кажется слегка запутанным, тогда это, вероятно, потому, что это.

Когда вы запускаете 32-разрядное приложение, некое «волшебное» сопоставление за кулисами означает, что для этого 32-разрядного приложения каталог System32 сопоставляется с каталогом SysWOW64, что означает, что в этом контексте 32-разрядные приложения теперь находятся в "C:\Windows\System32". Если это 32-разрядное приложение является вашей командной строкой, то оно не может найти bash и lxrun, потому что у них нет 32-разрядной версии и, следовательно, они не находятся в каталоге SysWOW64, который сопоставлен с System32, который является каталогом. в вашем ПУТИ. Итак, если вы возьмете свой (64-разрядный) проводник и перейдете в «C:\Windows\System32» и запустите «cmd.exe», вы получите 64-разрядную версию, но если вы запустите «C:\Windows\System32 \cmd.exe" из 32-разрядного приложения, вы получите 32-разрядный cmd.exe.

И для полноты: если вам нужен доступ к 64-разрядным системным файлам, таким как bash и lxrun, из 32-разрядного приложения, существует виртуальный каталог "C:\Windows\Sysnative", который доступен только из 32-разрядных программ, содержащих исходные 64-разрядные файлы System32.

Читайте также: