使用DOS批处理脚本获取特定文件的父目录名称

15 windows scripting cmd batch-file

我需要在DOS中找到文件的父目录的名称

对于前

假设这是目录

C:\test\pack\a.txt
Run Code Online (Sandbox Code Playgroud)

我有一个脚本,询问我文件名

C:\\>getname.bat     
enter file name: c:\test\pack\a.txt   
Run Code Online (Sandbox Code Playgroud)

现在脚本应该只返回文件的父名称.

pack           
Run Code Online (Sandbox Code Playgroud)

而不是文件的整个父路径.

c:\test\pack   
Run Code Online (Sandbox Code Playgroud)

小智 12

如果父目录名称包含空格,则上面的第一个答案不起作用.以下作品:

@echo off
setlocal

set ParentDir=%~p1
set ParentDir=%ParentDir: =:%
set ParentDir=%ParentDir:\= %
call :getparentdir %ParentDir%
set ParentDir=%ParentDir::= %

echo ParentDir is %ParentDir%
goto :EOF

:getparentdir
if "%~1" EQU "" goto :EOF
Set ParentDir=%~1
shift
goto :getparentdir
Run Code Online (Sandbox Code Playgroud)

使用参数"C:\ Temp\Parent Dir With Space\myfile.txt"调用上面的代码如下:

>GetParentDir "C:\Temp\Parent Dir With Space\myfile.txt"
ParentDir is Parent Dir With Space
Run Code Online (Sandbox Code Playgroud)

上面的工作是用冒号替换空格(这些在Windows路径中不应该存在),然后用空格替换目录分隔符,以便将各个目录作为单独的参数传递给getparentdir.函数getparentdir循环,直到找到它的最后一个参数.最后,结果中的任何冒号都被空格替换.


asd*_*dfg 11

看到这个问题

@echo OFF
set mydir="%~p1"
SET mydir=%mydir:\=;%

for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i
goto :EOF

:LAST_FOLDER
if "%1"=="" (
    @echo %LAST%
    goto :EOF
)

set LAST=%1
SHIFT

goto :LAST_FOLDER


fox*_*ive 10

获取批处理文件的父文件夹非常简单:

@echo off
for %%a in ("%~dp0\.") do set "parent=%%~nxa"
echo %parent%
Run Code Online (Sandbox Code Playgroud)

对于文件路径的父级,根据问题:

@echo off
for %%a in ("c:\test\pack\a.txt") do for %%b in ("%%~dpa\.") do set "parent=%%~nxb"
echo %parent%
Run Code Online (Sandbox Code Playgroud)

  • 我发现这对于查找位于批处理文件上方几个目录的父文件夹很有用。只需在“%〜dp0 \。”之后添加“ \ ..”即可进入文件夹级别。例如:对于(%% dp0 \。\ .. \ .. \ ..“)中的%% a,请设置“ parent = %%〜nxa”。 (2认同)
  • 虽然在学术上很有趣,但这并不能回答OP的问题。我处于同样的情况,从“C:\A\B\C.Bat”运行批处理文件,该文件正在处理文件“C:\D\E\Foo.txt” - 我不关心批处理文件本身的路径,我关心从文本文件的补丁中获取“E”。 (2认同)