如何从文件路径的文件夹路径与 CMD

我需要包含 cmd 文件的文件夹的路径。 使用 %0我可以得到文件名,但是如何得到文件夹名呢?

c:\temp\test.cmd >> test.cmd

附注: 我的工作目录! = 剧本文件夹。

367160 次浏览

对于文件夹名和驱动器,可以使用:

echo %~dp0

你可以使用不同的修饰语获得更多的信息:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file


The modifiers can be combined to get compound results:
%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

这是提示符上“ for/?”命令的复制粘贴。希望有帮助。

相关资料

十大 DOS 批处理技巧(是的,DOS 批处理...) 显示 Batchparams.bat(链接到源代码作为一个要点) :

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE

为了将这些变量赋给变量,请确保不要在等号前面或后面添加空格:

set filepath=%~dp1
set filename=%~nx1

那你就没问题了。

接受的答案是有帮助的,但是如果不使用传入的值,如何从路径中检索文件名并不明显。我可以通过这个帖子解决这个问题,但是如果其他人没有这么幸运的话,以下是解决方法:

@echo off
setlocal enabledelayedexpansion enableextensions


set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof


:file_name_from_path <resultVar> <pathVar>
(
set "%~1=%~nx2"
exit /b
)


:eof
endlocal

现在,可以在任何地方使用 :file_name_from_path函数来检索值,而不仅仅是传递参数。如果参数可以以不确定的顺序传递到文件中,或者路径根本没有传递到文件中,那么这将非常有帮助。

如果有人想要另一种方法..。

如果它是路径中的最后一个子目录,您可以使用以下一行程序:

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

这将返回以下内容:

c:\directory\subdirectory

. . 将返回到上一个目录。 /ad 只显示目录 /b 是一个纯格式的列表 /s 包含所有子目录。这用于获取要打印的目录的完整路径。

我在循环中遇到了同样的问题,我想在同一个目录中解压缩压缩文件,然后删除压缩文件。问题是7z 需要输出文件夹,所以我必须获取每个文件的文件夹路径。我的解决办法是:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
7z.exe x %%i -aoa -o%%i\..
)

% i 是一个完整的文件名路径,% ii. . 只返回父文件夹。

希望能有所帮助。

如果 Wadih 接受的答案对你不起作用,试试 echo %CD%

这是与一些编辑的示例 cmd 放在一起

@Echo off


Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off


set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%


SET /P src=Source Folder to Backup:
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"




set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"


if not exist %AppExePath% goto notInstalled


echo Backing up %source% to %dest%


%AppExePath% a -r -tzip %dest% %source%


echo %source% backed up to %dest% is complete!


TIMEOUT 5


exit;


:file_name_from_path <resultVar> <pathVar>
(
set "%~1=%~nx2"
exit /b
)




:notInstalled


echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/


:end
PAUSE