首页 > 解决方案 > 需要一些关于批处理文件的提示

问题描述

我对编码很陌生,我遇到了一个可能微不足道的问题,但让我拔掉了头发。

我正在使用批处理脚本来自动安装 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 命令,因为由于某种原因,除非以管理员身份执行,否则脚本将无法工作。

如果有人能给新手一些见解,将不胜感激。

标签: batch-file

解决方案


发现了我问题的根源。即使使用引号或多引号,脚本 1 的路径也没有忠实地传递给脚本 2。

感谢所有输入的家伙!


推荐阅读