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

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

例如。

假设这是目录

C:\test\pack\a.txt 

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

 C:\\>getname.bat enter file name: c:\test\pack\a.txt 

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

 pack 

而不是整个文件的父path。

 c:\test\pack 

看到这个问题

  @echo OFF
设置mydir =“%〜p1”
 SET mydir =%mydir:\ =;%

 for / F“tokens = * delims =;”  %%我IN(%mydir%)DO调用:LAST_FOLDER %%我
转到:EOF

 :LAST_FOLDER
如果“%1”==“”(
     @echo%LAST%
    转到:EOF


设置LAST =%1
转移

转到:LAST_FOLDER 

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

 @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 

使用参数“C:\ Temp \ Parent Dir With Space \ myfile.txt”调用上述给出如下:

 >GetParentDir "C:\Temp\Parent Dir With Space\myfile.txt" ParentDir is Parent Dir With Space 

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

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

 @echo off for %%a in ("%~dp0\.") do set "parent=%%~nxa" echo %parent% 

并根据问题的文件路径的父母:

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

你可以使用一个VBScript,例如保存下面的getpath.vbs

 Set objFS = CreateObject("Scripting.FileSystemObject") Set objArgs = WScript.Arguments strFile = objArgs(0) WScript.Echo objFS.GetParentFolderName(strFile) 

然后在命令行或批处理中执行此操作

 C:\test>cscript //nologo getpath.vbs c:\test\pack\a.txt c:\test\pack 

如果你想要一个批处理方法,你可以看看for /?

  %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only 

这是一个不使用CALL的方式,我相信更快。 基于jeb的拆分功能 (如果目录名称包含,可能会失败):

 @echo off set "mydir=%~p1" SET mydir=%mydir:~0,-1% setlocal EnableDelayedExpansion set LF=^ rem ** Two empty lines are required for %%L in ("!LF!") DO ( set "dir_name=!mydir:\=%%L!" ) for /f "delims=" %%P in (""!dir_name!"") do set "dn=%%~P" echo %dn% exit /b 0 

当查找我的脚本的父目录时,我发现djangofan和偏执的答案的这种组合方式既简单又完美。

 set FULL_PATH=%~dp0 set FULL_PATH=%FULL_PATH:~1,-1% for %%i in ("%FULL_PATH%") do set "PARENT_FOLDER=%%~ni" echo %PARENT_FOLDER% 

因为你想要改变用户输入,你必须做一些最小的额外的工作,以处理像C:\ foo \ bar \ a.txt与C:\ foo \ bar \ a.txt或c:\富/酒吧/ A.TXT。 这可能会为你工作:

 @setlocal @echo off call:GET_PARENT_FOLDER C:\foo\bar\a.txt echo %PARENT_FOLDER% call:GET_PARENT_FOLDER C:\foo\bar\\a.txt echo %PARENT_FOLDER% call:GET_PARENT_FOLDER c:/foo/bar/a.txt echo %PARENT_FOLDER% pause goto:EOF :GET_PARENT_FOLDER :: Strip the filename, so we get something like this: 'C:\foor\bar\' set "_FULL_PATH=%~dp1" :: Strips all dangling '\' and '/' in a loop, so the last folder name becomes accessible :_STRIP if not "%_FULL_PATH:~-1%"=="\" if not "%_FULL_PATH:~-1%"=="/" goto:_STRIP_END set "_FULL_PATH=%_FULL_PATH:~1,-1%" goto:_STRIP :_STRIP_END :: We need the context of a for-loop for the special path operators to be available for %%i in ("%_FULL_PATH%") do set "PARENT_FOLDER=%%~ni" goto:EOF 

DaDummy的想法在更实际的可重用功能中制定出来。 此外,_full_path的第一个字符现在包含在内。

 set map=D:\test1\test2\test3\test4.txt call:get_parent_path "%map%" echo full_path is %_full_path% call:get_parent_path %_full_path% echo full_path is %_full_path% call:get_last_path %_full_path% echo last_path is %_last_path% goto :eof :get_parent_path set "_full_path=%~dp1" :_strip if not "%_full_path:~-1%"=="\" if not "%_full_path:~-1%"=="/" goto:_strip_end set "_full_path=%_full_path:~0,-1%" goto:_strip :_strip_end exit /b :get_last_path set "_last_path=%~nx1" exit /b ::result: ::full_path is D:\test1\test2\test3 ::full_path is D:\test1\test2 ::last_path is test2 

这是另一个解决方案:

 SET LAST=%CD% SET PARENTNAME=NONE cd /DC:\test\pack FOR %%I in (%CD%) do SET PARENTNAME=%%~nI cd /D %LAST% ECHO %PARENTNAME% 

%%〜nI:'〜n'从存储在%% I变量中的路径中提取名称
cd:'/ D'参数添加到磁盘之间切换也

父目录名称“从一个批处理文件”就是这个。 我不得不跳过一些箍来处理目录名称中的空格:

 @echo off ::setlocal enableextensions,enabledelayedexpansion SET CDIR=%~p0 SET CDIR=%CDIR:~1,-1% SET CDIR=%CDIR:\=,% SET CDIR=%CDIR: =_% FOR %%a IN (%CDIR%) DO SET "CNAME=%%a" echo %CDIR% SET CNAME=%CNAME:_= % echo %CNAME% pause 

或者,这个更简单的方法,它显示了获取带有路径的完整目录名称以及目录名称本身:

 SET "_CDIR=%~dp0" FOR %%i IN ("%_CDIR%") DO SET _CDIR_NAME=%%~nxi