如何使用CMD从文件路径获取文件夹路径


151

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

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

PS我的当前目录!=脚本文件夹。

Answers:


310

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

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

凉。我需要特定分数来修改其他人的Wiki帖子吗?
Wadih M.

@Wadih M .:通常有用的链接stackoverflow.com/questions/18557/…–
jfs


@Wadih M .:通过以上链接:“ + 750编辑社区'wiki可编辑'帖子”
jfs

所以,如果你想有一个CMD脚本的工作目录设置为脚本的位置:cd /d "%~dp0"(从stackoverflow.com/questions/4451668
奈杰尔触摸

52

可接受的答案很有帮助,但是如果您不使用传入的值,如何立即从路径中检索文件名还不是很明显。我可以从此线程中解决此问题,但是如果其他人不太幸运,请按以下步骤操作:

@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函数可以在任何地方检索值,而不仅仅是传递给参数。如果参数可以不确定的顺序传递到文件中,或者根本没有将路径传递到文件中,则这将非常有用。


哇,太神奇了!因此Windows批处理文件在同一文件中支持功能,多么有用!从什么时候开始可能?
2014年

2
我喜欢您可以按引用(按原样)和按值(用“!”括起来)传递变量。好的,您可能没有“局部”变量和调用堆栈...但是,嘿:毕竟这是一个cmd脚本,无论如何这是向前迈出的一大步;)我同意,将内容分区到单个文件中更加方便而不是将其拆分成几个文件:)
路加福音

1
我认为“ goto:eof”应该是“ goto eof” ..没有冒号的话。
库德里(Khudairy)

2
参见:ss64.com/nt/syntax-args.html -使用%~dp1的驱动器和唯一路径。
安德鲁

2
@AKhudairy是正确的:ss64.com/nt/goto.html使用冒号时,goto会跳过endlocal(以及您随后放置的其他任何内容,例如暂停)。另外"!myPath!如果您的路径中有空格(或引号是myPath的一部分),则需要在周围加上s
Rick

8

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

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

那么您应该没有问题。


5

如果有人想要替代方法...

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

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

这将返回以下内容:

c:\directory\subdirectory

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


它可能适用于当前目录,而不适用于脚本文件所在的目录。
Mike Chaliy 2014年

4

我在循环中遇到了同样的问题,我想在同一目录中提取zip文件,然后删除该zip文件。问题是7z需要输出文件夹,因此我必须获取每个文件的文件夹路径。这是我的解决方案:

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

%% i是完整的文件名路径,而%ii \ ..仅返回父文件夹。

希望能帮助到你。


快速又脏。我喜欢!从来没有想过您用“ \ ..”冷扩展文件路径并以父文件夹结尾。
奥利弗·

这在Win10上对我有用:FOR / R“ C:\ sourceDir”%I IN(* .gz)DO C:\ 7-Zip64 \ 7z.exe x“%I” -aou -o%I \ .. \
b3wii

是! 这得到周围等问题%〜DP1(等)仅在0%工作,1%,2%,
Artelius


0

这与一些经过编辑的示例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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.