batch-file - 需要一些关于批处理文件的提示
问题描述
我对编码很陌生,我遇到了一个可能微不足道的问题,但让我拔掉了头发。
我正在使用批处理脚本来自动安装 VHD,在其中执行文件,然后暂停,直到用户按下任意键,这使得 VHD 被卸载并且脚本退出。这是主要的批处理文件:
@echo off
set fileVHD=Gord
CD /D "%~dp0"
powershell -command "Start-Process mount.cmd '%~dp0%fileVHD%.vhd' -Verb runas"
timeout /t 1
for /f %%D in ('wmic volume get DriveLetter^, Label ^| find "%fileVHD%"') do set usb=%%D
CD /D %usb%
index.html
echo "!!!!!!!!!!!!!!!!!!!!Press any key to fully close this program.!!!!!!!!!!!!!!!!!!!!!!!!!"
pause
CD /D "%~dp0"
powershell -command "Start-Process unmount.cmd '%~dp0%fileVHD%.vhd' -Verb runas"
exit
这是安装脚本(不是我制作的):
@echo off
setlocal enabledelayedexpansion
if "%~1"=="" (
echo Usage: %~nx0 [vhd] [letter]
exit /b 1
)
set "vhdPath=%~dpnx1"
set "driveLetter=%2"
if "!driveLetter!"=="" (
echo Mounting "!vhdPath!"
) else (
echo Mounting "!vhdPath!" to "!driveLetter!":
)
REM
REM create diskpart script
REM
set "diskPartScript=%~nx0.diskpart"
echo select vdisk file="!vhdPath!">"!diskPartScript!"
echo attach vdisk>>"!diskPartScript!"
REM assign the drive letter if requested
if not "!driveLetter!"=="" (
echo select partition 1 >>"!diskPartScript!"
echo assign letter="!driveLetter!">>"!diskPartScript!"
)
REM Show script
echo.
echo Running diskpart script:
type "!diskPartScript!"
REM
REM diskpart
REM
diskpart /s "!diskPartScript!"
del /q "!diskPartScript!"
echo Done!
endlocal
当所有文件都位于不包含空格的系统路径中时,一切正常。但它会在有空格的地方中断。这意味着代码中某处的路径因缺少引号而被错误地定义,可能在挂载脚本中。问题是当它开始使用所有“%~....”变量路径名时,我没有完全掌握安装脚本。我不得不混合一些 powershell 命令,因为由于某种原因,除非以管理员身份执行,否则脚本将无法工作。
如果有人能给新手一些见解,将不胜感激。
解决方案
发现了我问题的根源。即使使用引号或多引号,脚本 1 的路径也没有忠实地传递给脚本 2。
感谢所有输入的家伙!