#windows #batch-file #echo
Вопрос:
Как я могу сделать в пакетном файле, чтобы повторить (создать) другой пакетный файл для запуска в Windows, запустите и удалите его после запуска? [Попытка установки WSl 2 с одним пакетным сценарием на самом деле]
я попробовал это ,
@echo off
:: BatchGotAdmin
// asking one time admin priv code here
@echo off
title wsl setup Part 1 !
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
// and here is my another batch to need echo correctly in C:ProgramDataMicrosoftWindowsStart MenuProgramsStartUp for run after reboot
(echo @echo off^
:: BatchGotAdmin
// admin priv for seconf batch
@echo off
title wsl setup part 2 !
//other steps for download kernel and set default wsl version here
echo "Setup Finished, Deleting this bat" amp;amp; del C:ProgramDataMicrosoftWindowsStart MenuProgramsStartUpwsl-part2.bat amp;amp; pause
) > "C:ProgramDataMicrosoftWindowsStart MenuProgramsStartUpwsl-part2.bat"
//First batch again for asking reboot now or later
:PROMPT
SET /P REBOOTNOW=Do you want reboot now second script will run after reboot (Y/[N])?
IF /I "%REBOOTNOW%" NEQ "N" GOTO END
shutdown -r
:END
endlocal
Но я заблокировал цикл команд dism (потому что echo не является понятной строкой) и эхо только для целевого файла
@echo off:: BatchGotAdmin
Requesting administrative privileges...
Комментарии:
1. Почему вы хотите запустить пакетный файл при запуске, который попытается самостоятельно подняться, а затем запустить msi, a wsl.exe командуйте и установите дистрибутивное приложение. Все они являются отдельными исполняемыми файлами и могут быть запущены напрямую с использованием более эффективных методов.
2. @Compo, потому что мне нужен один файл, который может установить wsl single bat с одним admn priv. Это будет похоже на любую программу установки, которая хочет перезагрузиться, а затем запустить после перезагрузки один раз, а затем убить собственный сценарий запуска. Я могу запустить 2 отдельных пакетных файла для установки wsl , затем обновить wsl 2 и запустить любой дистрибутив, который я хочу. Один файл круче, чем 2 файла 🙂
3. Это не один файл, первый пакетный файл создает второй файл vbscript, запускает его, затем удаляет, затем пишет третий пакетный файл, который, вероятно, создает четвертый файл vbscript, запускает его, затем удаляет его, прежде чем в конечном итоге удалить себя. Таким образом, ваш «крутой» один файл-это, по крайней мере, три файла, возможно, четыре, которые просто излишне усложнены.
Ответ №1:
Несмотря на мой комментарий об обратном, если вы хотите сделать это, используя такую сложную методологию, вот общий синтаксис для этого:
( Echo @Echo Off
Echo Rem BatchGotAdmin
Echo // admin priv for second batch
Echo Title WSL Setup Part 2.
Echo // other steps for download kernel and set default WSL version here
Echo Echo Setup Finished, deleting this script.
Echo (GoTo^) 2^>Nul ^amp; Del "%%~f0"
) 1> "%ProgramData%MicrosoftWindowsStart MenuProgramsStartUpwsl-part2.cmd"
Вы должны отметить, что я изменил команду самостоятельного удаления на что-то более эффективное и функциональное. Он решил сделать это, потому что это показывает, что, используя этот метод, вам нужно избегать проблемных символов с помощью кареток (включая амперсанды, символы перенаправления, каналы и закрывающие скобки). Вам также нужно экранировать %
символы, удваивая их.
Комментарии:
1. Это хорошо, но каждая строка нуждается в эхе, верно? Можем ли мы написать это в ps, не повторяя каждую строку ?
2. «Мы» не можем это написать! Я ответил на ваш вопрос, поэтому, пожалуйста, отметьте его как принятый, вы спросили, как вам «Повторить» другой пакетный файл, и я показал вам именно это! Пожалуйста, задайте новый вопрос соответствующим образом, если у вас есть другая проблема с кодированием PowerShell и по теме. Помимо всего прочего, придерживаясь своей «более крутой» теории одного файла, как вы собираетесь запустить сценарий PowerShell, записать его из пакетного файла, запустить и удалить его?