2

要列出指定路径中文件的完整路径名,我可以使用:

FOR /F "tokens=*" %G IN ('DIR /B "path\*.*"') DO echo %~fG

错误的结果:<current_directory>\*.*

ss64.com 说:“如果将没有驱动器号/路径的文件名扩展为显示驱动器号/路径,命令外壳将假定;通常不正确;文件驻留在当前目录中。”

这是一种相当愚蠢的行为。然而,这可能是问题所在,因为 DIR 在这里返回了一个裸文件名。

有什么办法可以避免这种错误? 因为它很容易制作。

我知道我可以在 DIR 命令中使用 /S 选项,这会使结果成为完整路径名,但它也会通过不想要的子文件夹。

使用以下语法一切正常,但我不能使用 DIR 命令的优点:

FOR %G IN ("path\*.*") DO echo %~fG

结果:<path>\*.*

您对如何使用 DIR 和完整路径有任何提示或技巧吗?

4

3 回答 3

1

环境变量CD在任何时候都包含当前目录的路径,末尾总是没有反斜杠。

所以你可以使用你的例子:

@echo off
set "DirectoryPath=%CD%\path"
for /F "tokens=*" %%G in ('dir /B "path\*.*"') do echo %DirectoryPath%\%%G

因此,每当使用裸输出格式的DIR而不使用 also/S时,有必要首先确定目录路径并在FOR循环体中引用该路径。

使用固定绝对路径的示例:

@echo off
for /F "tokens=*" %%G in ('dir /B "C:\Temp\My Folder\*.*"') do echo C:\Temp\My Folder\%%G

不要忘记路径或文件名的双引号,在echo之外的其他命令上包含空格!

于 2015-10-22T12:00:13.820 回答
0

怎么用FORFILES?这将为您提供任何所需文件夹的完整路径:

forfiles /p C:\Some\Directory\ /c "cmd /c echo @path"

FORFILES真的很强大,因为它提供了很多选项,例如过滤器,rucursion 到子文件夹等。有关更多信息,请查看网站。

于 2015-10-22T11:37:54.133 回答
0

如果你真的需要使用dir命令

@echo off
setlocal ENABLEDELAYEDEXPANSION

set _subdir=path
set _mask=*.*

call :get_absolute_path _prefix "%CD%\%_subdir%"

rem  Iterate through a list of files, including files in subdirectories
for /f "tokens=*" %%A in ('dir /b /s /a:-d "%_prefix%\%_mask%"') do (
    rem  The current full file path
    set _f=%%A
    rem  Cut the "%CD%\%_subdir%\" prefix from the current file path
    set _f=!_f:%_prefix%\=!
    rem  Test whether the relative file path has a "subdir\" prefix:
    rem    split the relative file path by "\" delimiter and
    rem    pass %%B and %%C tokens (subdir and the remainder) to the loop
    for /f "delims=\ tokens=1*" %%B in ("!_f!") do (
        rem  If the remainder is empty string then print the full file path
        if "%%C"=="" echo %%A
    )
)

endlocal
exit /b 0

:get_absolute_path
set %1=%~f2
exit /b 0
于 2015-10-22T11:52:25.690 回答