为什么执行批处理文件导致错误消息“此时意外”?

时间:2015-04-09 17:27:03

标签: batch-file cmd environment-variables

不确定此批处理文件代码的确切问题。我在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")

代码在上面的行之后退出。

2 个答案:

答案 0 :(得分: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以查看所有预定义的环境变量以及系统范围内添加的环境变量,或仅在安装期间由应用程序添加的用户帐户。

答案 1 :(得分:0)

检索父文件夹的完整路径

更容易
@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%