【问题标题】:Why does execution of batch file result in error message "was unexpected at this time"?为什么执行批处理文件会导致错误消息“此时意外”?
【发布时间】:2015-04-09 17:27:03
【问题描述】:

不确定这个批处理文件代码的确切问题是什么。我在 CMD 窗口中以管理员身份运行它。它一直运行到IF NOT 语句的位置。我已经包含了输出(在代码下方),以使查看它的人尽可能容易。

此代码的目的是从pInstallDir 环境变量中的路径中删除最后一个子目录。

例如:pInstallDir="C:\program Files (x86)\uploads\field"

此代码应从pInstallDir 末尾删除一个字符,直到找到反斜杠\。这将使pInstallDir 的内容等于"C:\program Files (x86)\uploads"

我确定我遗漏了一些明显的东西。任何帮助将不胜感激。

echo Cleaning up Directories
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set pInstallDir="C:\Program Files(x86)\uploads\field\"
set pInstallDir=%pInstallDir:"=%
IF "%pInstallDir:~-1%"=="\" SET pInstallDir=%pInstallDir:~0,-1%
set nf="1"
:r_str
IF NOT "%pInstallDir:~-1%"=="\" (SET pInstallDir=%pInstallDir:~0,-1%) else (set nf="0")
echo %pInstallDir%
if "%nf%"=="1" (goto r_str) else (goto done)
pause
:done
IF %pInstallDir:~-1%"=="\" SET pInstallDir=%pInstallDir:~0,-1%
echo %pInstallDir%

输出

(回声关闭)

Cleaning up Directories
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set pInstallDir=C:\Program Files(x86)\uploads\field\
IF "\" == "\" SET pInstallDir=C:\Program Files(x86)\uploads\field
set nf="1"
\uploads\fiel) was unexpected at this time.
IF NOT "d"=="\" (SET pInstallDir=C:\Program Files(x86)\uploads\fiel) else (set nf="0")

代码在上面一行之后自行退出。

【问题讨论】:

    标签: batch-file cmd environment-variables


    【解决方案1】:

    将字符串值分配给环境变量时使用的双引号不正确。

    不好:

    set pInstallDir="C:\Program Files(x86)\uploads\field\"
    

    这会导致环境变量 pInstallDir 具有分配的路径,包括双引号,如果有空格,还会在行尾添加空格。

    更好的是:

    set "pInstallDir=C:\Program Files(x86)\uploads\field\"
    

    variable=value 是命令set 的参数,因此应始终使用此语法将带空格的值分配给环境变量。

    也可以使用:

    set pInstallDir=C:\Program Files(x86)\uploads\field\
    

    但是,如果此行末尾有 1 个或多个尾随空格,则可能会导致批处理文件的意外行为,因为在这种情况下,它们也被分配给变量。

    最好是使用

    set "pInstallDir=%ProgramFiles(x86)%\uploads\field\"
    

    在 Windows x64 上,预定义了一个名为 ProgramFiles(x86) 的环境变量,其中包含 32 位应用程序的默认目录路径。此环境变量未在 Windows x86 上定义,因此如果批处理文件在使用 32 位或 64 位 Windows 的机器上执行,大多数批处理文件都会使用此变量进行测试。

    显示上述 4 行不同结果的示例:

    @echo off
    set pInstallDir1="C:\Program Files(x86)\uploads\field\"
    set "pInstallDir2=C:\Program Files(x86)\uploads\field\"
    set pInstallDir3=C:\Program Files(x86)\uploads\field\
    set "pInstallDir4=%ProgramFiles(x86)%\uploads\field\"
    set pInstallDir
    pause
    

    打开命令提示符窗口并执行命令set 以查看所有预定义的环境变量以及在您的机器系统范围内添加的环境变量或仅在安装期间由应用程序为您的用户帐户添加的环境变量。

    【讨论】:

    • 设置的 pInstallDir 位于批处理文件中,因此可以为其分配一个值。通常它是从注册表项中读取的,所以我不确定如何设置 pInstallDir 变量是我的问题。我确实按照您的建议添加了引号,并且得到了 ****,否则此时是出乎意料的。 ****
    【解决方案2】:

    更容易检索父文件夹的完整路径

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "pInstallDir=C:\Program Files(x86)\uploads\field\"
        for %%a in ("%pInstallDir%\..") do set "pInstallDir=%%~fa"
        echo %pInstallDir%
    

    您的代码中的主要问题是引号,既存在不需要的引号,也存在缺少所需的引号,以及正在处理的值中存在括号。对于工作版本

    echo Cleaning up Directories
    setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
    
        set "pInstallDir=C:\Program Files(x86)\uploads\field\"
        IF "%pInstallDir:~-1%"=="\" SET "pInstallDir=%pInstallDir:~0,-1%"
        set "nf=1"
    :r_str
        IF NOT "%pInstallDir:~-1%"=="\" (SET "pInstallDir=%pInstallDir:~0,-1%") else (set "nf=0")
        echo %pInstallDir%
        if "%nf%"=="1" (goto r_str) else (goto done)
    :done
    IF "%pInstallDir:~-1%"=="\" SET "pInstallDir=%pInstallDir:~0,-1%"
    echo %pInstallDir%
    

    【讨论】:

    • 我相信我会使用你的更简单的版本。我不知道 \.. 方法。感谢您分享这些信息并感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多