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

Batch file 从变量中批量提取路径和文件名,batch-file,path,Batch File,Path,如何从变量中提取路径和文件名 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 filepa

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

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
以设置变量,而不是不回显它们

有关完整列表,请参见


ceztko的测试用例(供参考)


注释:请参阅注释。

您只能从(1)BAT本身的参数
%1
,或(2)调用
%1
的参数,或(3)变量
%a
的本地参数中提取路径和文件名


帮助电话
帮助
中,您可以找到更详细的信息:

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


然后尝试以下操作:

将要解析为参数的字符串传递给调用

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

:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof
或等效文件,将文件名作为本地变量传递

for %%a in (..\Desktop\fs.cfg) do (
    set file=%%~fa
    set filepath=%%~dpa
    set filename=%%~nxa
)    
echo %file% = %filepath% + %filename%

如果要从实际运行的批处理文件中获取信息, 试试这个:

@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 -第一PAR。传递给BACCHFILE……因此,您可以在第一(例如“%”)和最后(例如“1”)之间尝试这些东西(例如“~DP”),也适用于参数

< P>这对我来说都适用:

@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

回答晚了,我知道,但对我来说,下面的脚本非常有用——它也回答了这个问题,用一面旗击打两个苍蝇;-)

以下脚本在文件资源管理器的上下文菜单中展开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中打开”

脚本会将驱动器和路径更改为包含您选择的文件或文件夹的路径,并使用该路径打开命令shell-对于Visual Studio代码很有用,因为这样您就可以键入“Code.”在项目上下文中运行它

它是如何工作的

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

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


我希望这对某人有帮助。

@meir-true;我已经发布了一个更正。你在几年内学到了很多东西。@TrivisionZero:不,如果文件名或路径包含空格,则需要引号。@ceztko:请准确解释包含
/f
的功能。/f将循环的执行限制为仅包含一个标记,根据。在我的测试中,这是必要的,显然是因为传递的路径用引号括起来。在您的示例中,它是完全安全的,并且更明确地说明了循环将只执行一次。抱歉,我正在恢复更改,因为我注意到/F在路径中出现空格时,它不再工作。但是,我仍然存在以下问题:在我的用例(外壳扩展)中使用你的代码。如果我能找到,我将不再编辑并建议你修复我的用例。可能会重复更详细的答案。谢谢。
@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