从变量中批量提取路径和文件名


78

如何从变量中提取路径和文件名?

Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg

我想做到这一点而无需使用任何功能或任何GOTO。可能吗?


Answers:


138
@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
)

不是真的知道你所说的没有“功能”是什么意思

显然,更改ECHOSET设置变量而不是回声它们...

请参阅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
)

评论:请参阅评论。


1
@meir-是; 我已经发布了更正。您会在几年中学到很多东西。
Magoo 2015年

@TrivisionZero:否,如果文件名或路径包含空格,则必须使用引号。
Magoo'3

@ceztko:请准确说明包含的内容/f
Magoo

/ F根据说明文件,将循环的执行限制为一个令牌。在我的测试中,这是必要的,显然是因为通过的路径用引号引起来。在您的示例中,这是绝对安全的,并且对于循环仅执行一次这一事实,它更加明确。
ceztko

抱歉,我正在还原更改,因为我注意到/ F在路径中出现空格的情况下不再起作用。不过,在我的用例(shell扩展)中,您的代码仍然存在问题。如果可以的话,我不会再编辑并建议您解决此问题。
ceztko

132

您只能从(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%

方式更详细的答案。谢谢。
豪尔赫·富恩特斯·冈萨雷斯

13

所有这些都对我有用:

@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

2

如果要从实际运行的批处理文件中获取信息,请尝试以下操作:

@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:>帮助电话

%0 =参数0 =批处理文件%1 =参数1-1第一个参数。传递到批处理文件...因此,您也可以尝试在第一个参数(例如“%”)和最后一个参数(例如“ 1”)之间使用该参数(例如“〜dp”)


0

我知道较晚的答案,但是对我来说,以下脚本非常有用-它也回答了问题,用一个标志击中了两次苍蝇;-)

以下脚本在文件资源管理器的上下文菜单中展开“ SendTo ”:

@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

如果通过双击运行此脚本而没有任何参数,则它将自身复制到SendTo文件夹,并将其重命名为“ A-在CMD shell.cmd中打开”。之后,可以在“ SentTo”上下文菜单中使用它。

然后,在Windows资源管理器中右键单击任何文件或文件夹,然后选择“发送到> A-在CMD shell.cmd中打开”

该脚本会将驱动器和路径更改为包含所选文件或文件夹的路径,并使用该路径打开命令外壳-对Visual Studio Code很有用,因为您可以仅键入“ code”。在您的项目环境中运行它。

它是如何工作的?

%0 -批处理脚本的完整路径
%~d1 -第一个参数中包含的驱动器(例如,“ C:”)
%~dp1 -第一个参数中包含的路径
cmd /k-打开保持打开状态的命令外壳

这里没有用,但是 %~n1是第一个参数的文件名。

我希望这对某人有帮助。

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.