我需要在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