不确定此批处理文件代码的确切问题。我在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")
代码在上面的行之后退出。
答案 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%