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

Path 如何使用CMD从文件路径获取文件夹路径,path,cmd,Path,Cmd,我需要包含cmd文件的文件夹的路径。 使用%0,我可以获取文件名。但是如何获取文件夹名呢 c:\temp\test.cmd>>test.cmd 请注意我的当前目录!=脚本的文件夹。对于文件夹名称和驱动器,您可以使用: echo %~dp0 使用不同的修改器可以获得更多信息: %~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path

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

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


请注意我的当前目录!=脚本的文件夹。

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

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/?”命令的复制粘贴。希望能有帮助

相关的 显示(链接到源作为要点):


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

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
@echo关闭
setlocal enabledelayedexpansion enableextensions
设置myPath=C:\Somewhere\Somewhere\SomeFile.txt
调用:文件名来自路径结果!我的路!
回显%结果%
后藤:eof
:文件名来自路径
(
设置“%~1=%~nx2”
退出/b
)
:eof
端部

现在,
:file\u name\u from\u path
函数可以在任何地方用于检索值,而不仅仅是用于传入的参数。如果参数可以以不确定的顺序传递到文件中,或者路径根本没有传递到文件中,这将非常有帮助。

如果有人需要其他方法

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

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s
这将返回以下内容:

c:\directory\subdirectory
那个。。。。返回到上一个目录。 /广告只显示目录 /b是一个简单的格式列表
/s包括所有子目录。这用于获取要打印的目录的完整路径。

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

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 
%%我是一个完整的文件名路径和%ii\。。只返回父文件夹


希望能有帮助

如果Wadih接受的答案对您无效,请尝试
echo%CD%
这是与一些编辑过的示例组合在一起的

@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
@Echo关闭
回音********************************************************
使用7Zip进行Echo*ZIP文件夹备份*
Echo*用法:源文件夹、目标驱动器号*
Echo*源文件夹将压缩到目标\备份*
回音********************************************************
回音
设置年份=%date:~-4,4%
设置月份=%date:~-10,2%
设置日期=%date:~-7,2%
设置小时=%time:~-11,2%
设置小时=%hour:=0%
设置最小值=%time:~-8,2%
SET/P src=要备份的源文件夹:
设置源=%src%\*
调用:文件名来自路径nam%src%
SET/P destination=备份驱动器号:
设置zipfilename=%nam%。%year%。%month%。%day%。%hour%%min%.zip
set dest=“%destination%:\Backups\%zipfilename%”
set AppExePath=“%ProgramFiles(x86)%\7-Zip\7z.exe”
如果不存在%AppExePath%设置AppExePath=“%ProgramFiles%\7-Zip\7z.exe”
如果不存在%AppExePath%goto notInstalled
回显正在将%source%备份到%dest%
%AppExePath%a-r-tzip%dest%%source%
备份到%dest%的回显%source%已完成!
超时5
出口
:文件名来自路径
(
设置“%~1=%~nx2”
退出/b
)
:未安装
echo找不到7-Zip,请从以下位置安装:
回音http://7-zip.org/
:结束
暂停

很酷。我需要一个特别的分数来修改其他人的维基帖子吗?@Wadih M.:通常有用的链接@Wadih M.:特别是@Wadih M.:从上面的链接:“+750来编辑社区‘wiki editable’帖子”,所以如果你想要一个cmd脚本将工作目录设置到脚本的位置:
cd/d“%~dp0”
(From)哇,太神奇了!所以windows批处理文件支持同一文件内的功能,多么有用!从什么时候起这是可能的?我喜欢你可以通过引用(按原样)和值(用“!”s包围)来传递变量。好的,您可能没有“本地”变量和调用堆栈。。。但是,嘿:毕竟这是一个cmd脚本,不管怎么说,这是向前迈出的一大步;)我同意,在一个文件中分区比在几个文件中拆分要方便得多:)我认为“goto:eof”应该是“goto-eof”。。没有冒号。。因为它对我来说是破坏性的。另请参见:-仅对驱动器和路径使用
%~dp1
。@AKhudairy是正确的:使用冒号,goto会跳过endlocal(以及您随后放置的任何内容,如暂停)。另外,您还需要在
!myPath!
周围添加
s”如果您的路径中有空格(或者引号是myPath的一部分),则它可能对当前目录有效,而不是脚本文件所在的目录。快速且肮脏。我喜欢这样!从没想过您会用“\”冷扩展文件路径。。最后是父文件夹。这在Win10上对我有效:for/R“C:\sourceDir”%I IN(*.gz)DO C:\7-Zip64\7z.exe x”%I“-aou-o%I\..\Yes!这就解决了%dp1(等)只能在%0、%1、%2等上工作的问题。
@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