88

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

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

我想在不使用任何功能或任何 GOTO 的情况下做到这一点。是否可以?

4

5 回答 5

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

评论:请看评论。

于 2013-03-22T10:32:41.343 回答
144

您只能从 (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%
于 2013-03-22T10:33:08.657 回答
14

所有这些都对我有用:

@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
于 2018-01-02T23:02:30.087 回答
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 - 1st par. 传递给批处理文件...所以你可以在第一个(例如“%”)和最后一个(例如“1”)之间尝试那些东西(例如“~dp”)作为参数

于 2017-10-27T15:08:22.550 回答
1

迟到的答案,我知道,但对我来说,下面的脚本非常有用 - 它也回答了这个问题,用一个标志击中两只苍蝇;-)

以下脚本在文件资源管理器的上下文菜单中展开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 资源管理器中的任何文件或文件夹,然后选择“SendTo > A - 在 CMD shell.cmd 中打开”

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

它是如何工作的?

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

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

我希望这对某人有帮助。

于 2020-06-29T09:05:16.597 回答