如何在批处理脚本中从文件路径获取目录路径

时间:2017-04-10 14:52:43

标签: windows batch-file cmd

我是Command脚本的新手,请在下面的问题中提供帮助。

我有以下for循环,它返回C:\test文件夹及其子文件夹中可用文件的路径。我想要文件路径中的目录路径例如。

如果for循环返回C:\test\scripts\sample.txt但我只想要C:\test\scripts。为此我已将下面的命令写到

For /R C:\seq\ %%a IN (*) do (
set filename="%%a"
echo %filename%
)

这不是将文件路径分配给变量文件名,因此我可以从中获取目录路径。请帮助从批处理脚本中的文件路径获取目录路径。

3 个答案:

答案 0 :(得分:1)

要获取文件或目录的父目录的路径,请使用~dp modifierfor变量引用。如果尾随\干扰,您可以使用另一个for循环,如下所示:

for /R "C:\test\scripts" %%I IN ("*.txt") do (
    echo Path to parent with trailing `\`: "%%~dpI"
    echo Path to parent with trailing `\.`: "%%~dpI."
    for /D %%J in ("%%~dpI.") do (
        echo Pure path to parent: "%%~fJ"
    )
)

我建议删除sub-string expansion的尾部反斜杠(在循环中执行此操作时需要delayed expansion,正如其他人已经说过的那样),因为那里可能是生成的路径不再指向原始位置的情况。例如,路径D:\指向驱动器D: root 目录;删除\后,路径为D:,指向驱动器的当前目录。使用上述技术可以避免这些问题。

答案 1 :(得分:0)

您只需使用dp修饰符:

set filename=%%~dpa

此外,对于echo变量,您需要使用延迟扩展来扩展它:

setlocal enabledelayedexpansion
For /R C:\seq\ %%a IN (*) do (
set filename="%%a"
echo !filename!
)

答案 2 :(得分:0)

For /R C:\seq\ %%a IN (*) do (
set filename="%%~dpa"
call echo %%filename:~0,-1%%
)

请参阅许多有关delayed expansion的SO文章,了解其他展示filename的方法。

~dp指定%%a的驱动器和路径。

从提示中查看for /?|more以获取信息

:~0,-1中的echo选择最后一个字符

从文档提示

中查看set /?
相关问题