【问题标题】:How to getting directory path from file path in batch scripting如何在批处理脚本中从文件路径获取目录路径
【发布时间】:2017-04-10 14:52:42
【问题描述】:

我对命令脚本非常陌生,请帮助解决以下问题。

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

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

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

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

【问题讨论】:

  • 看看for /?,尤其是~-modifiers

标签: windows batch-file cmd


【解决方案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:,指向驱动器的当前目录。使用上述技术可以避免此类问题。

【讨论】:

    【解决方案2】:

    您只需要使用dp 修饰符:

    set filename=%%~dpa
    

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

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

    【讨论】:

      【解决方案3】:
      For /R C:\seq\ %%a IN (*) do (
      set filename="%%~dpa"
      call echo %%filename:~0,-1%%
      )
      

      请参阅许多关于delayed expansion 的SO 文章以了解其他显示filename 的方式。

      ~dp 分配%%a 的驱动器和路径。

      在提示信息中查看for /?|more

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

      在文档提示中查看set /?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 2016-01-12
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        相关资源
        最近更新 更多