【问题标题】:Batch Script to Echo another batch script批处理脚本回显另一个批处理脚本
【发布时间】:2021-06-08 21:07:09
【问题描述】:

如何在批处理文件中回显(创建)另一个批处理文件以在 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:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\ 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" && del C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\wsl-part2.bat && pause
) > "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\wsl-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...

【问题讨论】:

  • 你为什么要在启动时运行一个批处理文件,它会尝试自我提升然后运行一个 msi、一个 wsl.exe 命令并安装一个发行版应用程序。所有这些都是单独的可执行文件,可以使用更有效的方法直接运行。
  • @Compo 因为我想要单个文件,它可以使用单个 admn priv 安装 wsl 单个 bat。它将像任何想要重新启动然后在重新启动后运行然后终止启动自己的启动脚本的安装程序。我可以使用 2 个单独的批处理文件来安装 wsl,然后升级 wsl 2 并运行我想要的任何发行版。单个文件比 2 个文件更酷:)
  • 这不是一个文件,第一个批处理文件正在创建第二个 vbscript 文件,运行它然后删除它,然后编写可能创建第四个 vbscript 文件的第三个批处理文件运行它然后删除它,在最终删除自己之前。因此,您的“更酷”的一个文件至少是三个文件,可能是四个文件,只是变得不必要地复杂了。

标签: windows batch-file echo


【解决方案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 ^& Del "%%~f0"
) 1> "%ProgramData%\Microsoft\Windows\Start Menu\Programs\StartUp\wsl-part2.cmd"

您应该注意到,我已将自删除命令更改为更有效和更实用的命令。它决定这样做是因为它向您表明,使用此方法,您需要使用插入符号 (包括与号、重定向符号、管道和右括号)来转义有问题的字符。您还需要通过将% 字符加倍来转义它们。

【讨论】:

  • 这很好,但每一行都需要回显,对吗?我们可以在不回显每一行的情况下用 ps 写这个吗?
  • '我们'不能写!我已经回答了你的问题,所以请将其标记为已接受,你问过如何“回显”另一个批处理文件,我已经向你展示了这一点!如果您有不同的主题,PowerShell 编码问题,请以适当的方式提出一个新问题。除了其他,坚持你的“更酷”的单一文件理论,你将如何运行 PowerShell 脚本,从批处理文件中编写它,运行它,然后删除它?
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多