我需要获取包含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 /?”命令复制粘贴的。
前十个DOS批处理提示(是的,DOS批处理...)显示batchparams.bat(源代码链接为gist):
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
接受的答案很有帮助,但如果您没有使用传递的值,如何从路径中检索文件名并不是立即显而易见的。我能够从这个线程中解决这个问题,但是为了其他人不那么幸运,这就是如何实现的:
@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
函数来检索值,而不仅仅是传递参数的情况。如果参数的顺序不能确定或路径未传递到文件中,则此方法会非常有用。
%~dp1
获取驱动器和路径。 - Andrew为了将它们分配给变量,请确保在等号前后不要添加空格:
set filepath=%~dp1
set filename=%~nx1
那么你应该没有问题。
如果有人想要另一种方法...
如果它是路径中的最后一个子目录,您可以使用这个一行代码:
cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s
c:\directory\subdirectory
该命令将向前切换到上一个目录。 /ad 仅显示目录 /b 是一种简洁的格式列表 /s 包括所有子目录。这用于获取要打印的目录的完整路径。
我在循环中遇到了同样的问题,我想要将zip文件提取到相同的目录中,然后再删除zip文件。问题是7z需要输出文件夹,因此我必须获取每个文件的文件夹路径。这是我的解决方案:
FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
7z.exe x %%i -aoa -o%%i\..
)
%%i代表完整的文件名路径,%ii\..则表示返回父级文件夹。
希望对您有所帮助。
echo %CD%
命令。请注意保留HTML标签。这是使用一些编辑过的示例 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
在我看来,获取文件完整路径最简单但最强大的方法是:
现在你可以选择:
无论您选择选项1还是选项2,一毫秒后,您都可以:
即可将完整的路径和文件名粘贴到任何您想要的地方。
简单、强大,而且不需要使用任何外部 Windows 工具。
对于 .bat
文件,您可能想使用以下命令:
title %~f0