如何从批处理脚本中的文件路径获取目录路径
问题描述:
我很新的命令脚本,请在下面的问题帮助。如何从批处理脚本中的文件路径获取目录路径
我有下面的for循环,它返回C:\test
文件夹及其子文件夹中可用文件的路径。我想要文件路径中的目录路径例如。
如果for循环返回C:\test\scripts\sample.txt
但我只想要C:\test\scripts
。对于这个我写下面的命令
For /R C:\seq\ %%a IN (*) do (
set filename="%%a"
echo %filename%
)
这是不分配文件路径到变量文件名,所以我可以得到它的目录路径。请在批处理脚本中帮助从文件路径获取目录路径。
答
你只需要使用dp
修改:
set filename=%%~dpa
此外,为echo
变量,你需要与延迟扩展,扩展它:
setlocal enabledelayedexpansion
For /R C:\seq\ %%a IN (*) do (
set filename="%%a"
echo !filename!
)
答
For /R C:\seq\ %%a IN (*) do (
set filename="%%~dpa"
call echo %%filename:~0,-1%%
)
请参阅许多SO文章约delayed expansion
其他方式显示filename
。
~dp
指定%%a
的驱动器和路径。
看到for /?|more
从提示信息
的:~0,-1
在echo
选择所有文字栏最后一个
看到set /?
从提示文档
答
要获得路径文件或目录的父目录,请使用for
变量引用的~dp
modifier。如果后\
会干扰,你可以使用另一个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:
的根目录目录;删除\
后,路径为D:
,该路径指向驱动器目录当前。使用上述技术避免了这样的问题。
看看'for /?'特别是'〜' - 修饰符 – LotPings