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

Вопрос или проблема

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

Команда, которую я использую, это wsl --install Ubuntu-24.04.
Это работает, запрашиваются имя пользователя, пароль и так далее, однако как только все установлено, bat-файл застревает в оболочке Linux, и пользователю нужно ввести exit, чтобы выйти из оболочки и продолжить выполнение bat-файла.

При попытке использовать wsl --install Ubuntu-24.04 --no-launch, команда возвращается в bat-файл, однако, когда я пытаюсь выполнить следующую команду wsl -d Ubuntu-24.04 -- exit (чтобы фактически запустить дистрибутив для выполнения дополнительных команд), я получаю код ошибки Wsl/Service/WSL_E_DISTRO_NOT_FOUND.

Дистрибутив также не отображается при выполнении wsl --list, потому что, видимо, --no-launch не только ‘не запускает’, но и ‘не (правильно) устанавливает’.
Скорее, кажется, что все, что оно делает, это ‘скачивает для последующей установки’.

Выполнение команды echo exit | wsl --install Ubuntu-24.04 также не работает, потому что первым вводом должно быть имя пользователя, за которым следует пароль.
И даже если я предварительно запрошу оба из скрипта, одно лишь имя пользователя уже вызывает у меня ошибку.

@echo off

start "" /b "%WinDir%\System32\wsl.exe" --install Ubuntu-24.04 >"%temp%\install_log.txt" 2>&1

%:^O
"%WinDir%\System32\wsl.exe" -l -v | "%WinDir%\System32\findstr.exe" /i Instal >nul && =;(
     "%WinDir%\System32\timeout.exe" /t 02 >nul | echo/Please wait! & goto %:^O );= 

echo/Installation completed!
"%WinDir%\System32\taskkill.exe" /f /im wsl.exe >nul 2>&1 && =;(
   echo/Distribution installation completed and WSL terminated. );=

type "%temp%\install_log.txt" | clip

1. Запустите вашу команду wsl --install ..., выполняя ее в фоновом режиме:

start "" /Background wsl --install ....

2. Используйте цикл для мониторинга действия и реализации тайм-аута.

:loop
// команда проверки строки вывода && если найдена ==> тайм-аут и переход к :loop

3. Используйте команду wsl.exe -l -v | findstr /i Installing для проверки статуса завершения.

wsl -l -v | findstr /i Instal >nul && (
     echo/Affirmative, the string was found, the installation is still in progress... 
     timeout 2 | echo wait! & goto :loop 
    );= 

4. Если установка все еще в процессе, строка Installing появится в выводе. Как только установка завершена, строка больше не будет присутствовать. Пока строка находится, цикл/тайм-аут будет продолжать выполняться.

:: запуск команды && ( продолжать переход к :label )

wsl -l -v | findstr /i Instal >nul && ( timeout 02 | echo/ wait! & goto :loop ) 

_ _ _

**5.** Когда строка больше не обнаруживается, это означает завершение установки. На этом этапе оставшаяся задача состоит в завершении процесса WSL, запущенного в фоновом режиме. Поэтому завершите процесс вместо отправки команды **`exit`**.

_ _ _

Когда строка больше не обнаруживается, это означает завершение установки. На этом этапе оставшаяся задача состоит в завершении процесса WSL, запущенного в фоновом режиме. Поэтому завершите процесс вместо отправки команды exit.

.

Ответ или решение

Уважаемый коллега,

Проблема, с которой вы столкнулись при автоматической установке дистрибутива Ubuntu-24.04 через Windows Subsystem for Linux (WSL), действительно требует изобретательного подхода для решения. В связи с этим, я предлагаю несколько методов для достижения вашей цели с минимальным вмешательством пользователя.

Теория

Когда мы используем команду wsl --install для установки дистрибутива Linux, происходит автоматический запуск свежей установки, требующий ввода имени пользователя и пароля. Это приводит к тому, что скрипт зависает в оболочке Linux, и дальнейшая автоматизация прерывается. Опция --no-launch в данном контексте не устанавливает дистрибутив до конца, оставляя его на стадии загрузки.

Пример

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

Применение

  1. Асинхронный Запуск Установки

Создаем bat файл с асинхронным запуском установки дистрибутива:

@echo off
start "" /b "%Windir%\System32\wsl.exe" --install Ubuntu-24.04 > "%temp%\install_log.txt" 2>&1
  1. Мониторинг Процесса Установки

Для мониторинга статуса установки используем цикл с проверкой наличия слова "Installing":

:loop
"%Windir%\System32\wsl.exe" -l -v | "%Windir%\System32\findstr.exe" /i Installing >nul
if %errorlevel% equ 0 (
    timeout /t 2 >nul
    goto loop
)
  1. Завершение Процесса WSL

После окончания установки и выхода из цикла завершаем процесс WSL:

echo Установка завершена!
"%Windir%\System32\taskkill.exe" /f /im wsl.exe >nul 2>&1
echo Установка и завершение WSL выполнены успешно

Заключение

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

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

С уважением,
Ваш IT эксперт.

Оцените материал
Добавить комментарий

Капча загружается...