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

Posted

技术标签:

【中文标题】如何使用 CMD 从文件路径中获取文件夹路径【英文标题】:How to get folder path from file path with CMD 【发布时间】:2010-10-14 03:56:48 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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 /?”的复制粘贴提示符下的命令。希望对您有所帮助。

相关

Top 10 DOS Batch tips (Yes, DOS Batch...) 显示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.:一般有用的链接***.com/questions/18557/… @Wadih M.:特别是***.com/questions/130654/… @Wadih M.:来自上面的链接:“+750 to edit community 'wiki editable' posts” 所以如果你想要一个cmd脚本来设置工作目录到脚本所在的位置:cd /d "%~dp0"(来自***.com/questions/4451668)【参考方案2】:

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

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

那么你应该没有问题。

【讨论】:

【参考方案3】:

接受的答案很有帮助,但如果您不使用传入的值,如何从路径中检索文件名并不是很明显。我能够从这个线程中解决这个问题,但如果其他人不那么幸运,那么它是如何完成的:

@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批处理文件支持同一文件内的功能,多么有用!从什么时候开始有可能? 我喜欢你可以通过引用(按原样)和值(用“!”包围)传递变量。好的,你可能没有“本地”变量和调用堆栈......但是嘿:它毕竟是一个 cmd 脚本,无论如何它都是向前迈出的一大步;)我同意,在单个文件中分区内容更方便而不是将它分成几个文件:) 我认为“goto :eof”应该是“goto eof”......没有冒号......因为它对我来说很糟糕。 另请参阅:ss64.com/nt/syntax-args.html - 仅将 %~dp1 用于驱动器和路径。 @AKhudairy 是正确的:ss64.com/nt/goto.html 带有冒号的 goto 会跳过 endlocal(以及您之后放置的任何其他内容,例如暂停)。如果您的路径中有空格(或者引号是 myPath 的一部分),您还需要在 !myPath! 周围添加 "s【参考方案4】:

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

如果是路径的最后一个子目录,可以用这个单行:

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

这将返回以下内容:

c:\directory\subdirectory

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

【讨论】:

它可能适用于当前目录,而不是脚本文件所在的目录。【参考方案5】:

我在循环中遇到了同样的问题,我想在同一目录中提取 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\..\ 是的!这解决了 %~dp1(等)仅适用于 %0、%1、%2 等的问题。【参考方案6】:

如果 Wadih 接受的答案不适合您,请尝试 echo %CD%

【讨论】:

没有。 %CD% 返回您启动 .cmd 文件的当前工作目录,而不是存储 .cmd 文件本身的目录【参考方案7】:

这是与一些经过编辑的示例 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

【讨论】:

以上是关于如何使用 CMD 从文件路径中获取文件夹路径的主要内容,如果未能解决你的问题,请参考以下文章

如何用CMD提取一个文件路径的文件名?并赋值 高分送上

如何使用Javascript从文件上传中获取完整路径

如何使用 JavaScript 从完整路径中获取文件名?

java 项目如何获取项目所在的物理根路径

如何从 Bundle 中获取 PNG 文件的资源路径?

如何从文件的完整路径中获取目录?