我使用此脚本查找当前文件夹及其.bat文件:
for /f %%i in ("%0") do set curpath=%%~dpi
echo %curpath%
如果路径包含空格(D:\ Scripts \ All Scripts - >只检索D:\ Scripts \,如果我放在文件夹中,其路径不包含空格,则它无法正常工作)有空格,它检索完整的路径)。我该如何解决?
答案 0 :(得分:45)
2015-03-30:已编辑 - 已添加缺失的信息
要检索当前目录,您可以使用包含当前活动目录的动态%cd%
变量
set "curpath=%cd%"
这将生成一个带有根目录的结尾反斜杠的值,并且没有其他目录的反斜杠。您可以使用
强制和结束任何目录的反斜杠for %%a in ("%cd%\") do set "curpath=%%~fa"
或者您可以使用另一个动态变量:%__CD__%
,它将返回带有结尾反斜杠的当前活动目录。
另外,请记住%cd%
变量可以直接赋值。在这种情况下,返回的值不是当前目录,而是指定的值。您可以通过引用当前目录
for %%a in (".\") do set "curpath=%%~fa"
在Windows XP中,%__CD__%
变量具有相同的行为。它可以被用户覆盖,但至少从Windows 7(我无法在Vista上测试),允许对%__CD__%
进行任何更改,但是当读取变量时,忽略更改的值并且检索当前正确的活动目录(注意:使用set
命令仍然可以看到更改的值)。
但以前的所有代码都将返回当前活动目录,而不是存储批处理文件的目录。
set "curpath=%~dp0"
它将返回存储批处理文件的目录,并带有反斜杠。
但如果在批处理文件中使用了shift
命令
shift
echo %~dp0
由于批处理文件的参数已移位,因此对当前批处理文件的%0
引用将丢失。
为了防止这种情况,您可以在任何移位之前检索对批处理文件的引用,或者将语法更改为shift /1
以确保移位操作将从第一个参数开始,而不会影响对批处理文件的引用。如果您不能使用任何此选项,则可以在调用子例程时检索对当前批处理文件的引用
@echo off
setlocal enableextensions
rem Destroy batch file reference
shift
echo batch folder is "%~dp0"
rem Call the subroutine to get the batch folder
call :getBatchFolder batchFolder
echo batch folder is "%batchFolder%"
exit /b
:getBatchFolder returnVar
set "%~1=%~dp0" & exit /b
如果在调用时引用批处理文件名并且未使用完整引用(读取here),则此方法也是必需的。
答案 1 :(得分:12)
for /f "delims=" %%i in ("%0") do set "curpath=%%~dpi"
echo "%curpath%"
或
echo "%cd%"
如果路径包含任何&
个字符,则需要双引号。
答案 2 :(得分:0)
使用此代码
@echo off
:: Get the current directory
for /f "tokens=* delims=/" %%A in ('cd') do set CURRENT_DIR=%%A
echo CURRENT_DIR%%A
(回显此确认此代码可以正常工作)