查找当前文件夹的路径 - cmd

时间:2014-08-22 01:04:54

标签: cmd

我使用此脚本查找当前文件夹及其.bat文件:

for /f %%i in ("%0") do set curpath=%%~dpi 
echo  %curpath% 

如果路径包含空格(D:\ Scripts \ All Scripts - >只检索D:\ Scripts \,如果我放在文件夹中,其路径不包含空格,则它无法正常工作)有空格,它检索完整的路径)。我该如何解决?

3 个答案:

答案 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 

(回显此确认此代码可以正常工作)