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

时间:2013-03-22 10:15:53

标签: batch-file path

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

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

我想在不使用任何功能或任何GOTO的情况下这样做。 有可能吗?

5 个答案:

答案 0 :(得分:123)

@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以设置变量而不是ECHOing ...

有关完整列表,请参阅for documentation


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 :(得分:116)

您只能从(1)BAT本身%1的参数,或(2)CALL %1的参数或(3)本地FOR变量{{中提取路径和文件名。 1}}。


%%aHELP CALL您可以找到更详细的信息:

%~1 - 展开%1,删除任何周围的引号(“) %~f1 - 将%1扩展为完全限定的路径名​​
%~d1 - 将%1扩展为仅驱动器号 %~p1 - 将%1扩展为仅路径
%~n1 - 将%1扩展为仅文件名
%~x1 - 将%1扩展为仅文件扩展名
%~s1 - 扩展路径仅包含短名称 %~a1 - 将%1扩展为文件属性
%~t1 - 将%1扩展为文件的日期/时间
%~z1 - 将%1扩展为文件大小


然后尝试以下方法:

将要解析的字符串作为参数传递给CALL

HELP FOR

或等效文件,将文件名作为本地FOR变量

传递
call :setfile ..\Desktop\fs.cfg
echo %file% = %filepath% + %filename%
goto :eof

:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof

答案 2 :(得分:12)

所有这些对我有用:

@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

答案 3 :(得分: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") )也用于参数

答案 4 :(得分: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资源管理器中右键单击任何文件或文件夹,然后选择“ SendTo> A-Open in CMD shell.cmd”

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

它如何工作?

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

此处未使用,但是%~n1是第一个参数的文件名。

我希望这对某人有帮助。