为什么执行批处理文件会导致错误消息 "was unexpected at this time"?

Why does execution of batch file result in error message "was unexpected at this time"?

不确定这个批处理文件代码的确切问题是什么。我是 运行 它作为 CMD window 的管理员。它一直运行到 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")

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

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

不好:

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.[=19= 的计算机上执行的,则大多数批处理文件都会使用此变量进行测试。 ]

显示上述 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

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

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

@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%