我怎样从一个变量中提取路径和文件名?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
我想在不使用任何函数或任何GOTO的情况下做到这一点。这可能吗?
我怎样从一个变量中提取路径和文件名?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
我想在不使用任何函数或任何GOTO的情况下做到这一点。这可能吗?
@ECHO OFF
SETLOCAL
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
不是很确定你所说的“没有函数”是什么意思。
显然,将ECHO
更改为SET
以设置变量而非输出它们...
有关完整列表,请参见for
文档。
ceztko的测试用例(供参考)
@ECHO OFF
SETLOCAL
set file="C:\Users\ l72rugschiri\Desktop\fs.cfg"
FOR /F "delims=" %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
评论:请查看评论。
file
中每个空格/逗号/制表符分隔的字符串部分都应依次应用于元变量%%i
。如果file
的值包含引号,则额外的引号是适得其反的,但正如上面的评论所解释的那样,我认为在分配给变量的值中包含引号并不是一个好主意,因为这会导致需要进行各种花式操作才能在需要时将它们删除,而添加引号则是一项简单的任务。你的情况可能有所不同。 - Magoo你只能从以下三个位置提取路径和文件名:(1) BAT 参数本身的 %1
,(2) CALL 参数的 %1
或 (3) 一个本地 FOR 变量 %%a
。
在 HELP CALL
或 HELP FOR
中,你可以找到更详细的信息:
%~1 - 扩展 %1 并去除任何周围的引号 (")
%~f1 - 将 %1 扩展为完全限定的路径名
%~d1 - 将 %1 扩展为仅驱动器号
%~p1 - 将 %1 扩展为仅路径
%~n1 - 将 %1 扩展为仅文件名
%~x1 - 将 %1 扩展为仅文件扩展名
%~s1 - 扩展的路径仅包含短名称
%~a1 - 将 %1 扩展到文件属性
%~t1 - 将 %1 扩展到文件的日期/时间
%~z1 - 将 %1 扩展到文件大小
然后尝试以下操作:
将要解析的字符串作为参数传递给 CALL。
call :setfile ..\Desktop\fs.cfg
echo %file% = %filepath% + %filename%
goto :eof
:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof
或者等效方式,将文件名作为本地FOR变量传递
for %%a in (..\Desktop\fs.cfg) do (
set file=%%~fa
set filepath=%%~dpa
set filename=%%~nxa
)
echo %file% = %filepath% + %filename%
所有这些都适用于我:
@Echo Off
Echo Directory = %~dp0
Echo Object Name With Quotations=%0
Echo Object Name Without Quotes=%~0
Echo Bat File Drive = %~d0
Echo Full File Name = %~n0%~x0
Echo File Name Without Extension = %~n0
Echo File Extension = %~x0
Pause>Nul
输出:
Directory = D:\Users\Thejordster135\Desktop\Code\BAT\
Object Name With Quotations="D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat"
Object Name Without Quotes=D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat
Bat File Drive = D:
Full File Name = Path.bat
File Name Without Extension = Path
File Extension = .bat
如果你想获取正在运行的批处理文件的信息,可以尝试以下方法:
@echo off
set myNameFull=%0
echo myNameFull %myNameFull%
set myNameShort=%~n0
echo myNameShort %myNameShort%
set myNameLong=%~nx0
echo myNameLong %myNameLong%
set myPath=%~dp0
echo myPath %myPath%
set myLogfileWpath=%myPath%%myNameShort%.log
echo myLogfileWpath %myLogfileWpath%
需要更多示例吗? C:> HELP CALL
%0 = 参数0 = 批处理文件 %1 = 参数1 - 传递给批处理文件的第一个参数...所以您可以在第一个参数(例如“%”)和最后一个参数(例如“1”)之间尝试使用该内容(例如“〜dp”)。
@echo off
cls
if "%~dp1"=="" goto Install
REM change drive, then cd to path given and run shell there
%~d1
cd "%~dp1"
cmd /k
goto End
:Install
rem No arguments: Copies itself into SendTo folder
copy "%0" "%appdata%\Microsoft\Windows\SendTo\A - Open in CMD shell.cmd"
:End
%0
- 批处理脚本的完整路径%~d1
- 第一个参数中包含的驱动器(例如“C:”)%~dp1
- 第一个参数中包含的路径cmd /k
- 打开保持打开的命令shell%~n1
是第一个参数的文件名。