【问题标题】:Batch Extract path and filename from a variable从变量中批量提取路径和文件名
【发布时间】:2013-03-22 10:15:52
【问题描述】:

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

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

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

【问题讨论】:

标签: batch-file path


【解决方案1】:
@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 以设置变量而不是回显它们...

查看fordocumentation 获取完整列表。


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
)

评论:请参阅 cmets。

【讨论】:

  • @meir - 真;我已经发布了更正。几年后你会学到很多东西。
  • @TrivisionZero:不,如果文件名或路径包含空格,则需要引号。
  • @ceztko : 请准确解释包含/f 的作用。
  • /F 根据documentation,将循环的执行限制为仅一个标记。在我的测试中,这是必要的,显然是因为通过的路径用引号括起来。在您的示例中,它非常安全,并且更明确地说明了循环只会执行一次这一事实。
  • 抱歉,我正在还原更改,因为我注意到 /F 在路径中有空格的情况下它不再起作用。不过,我的用例(shell 扩展)中的代码存在问题。如果我能找到它,我将不再编辑并建议您解决我的情况。
【解决方案2】:

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


您可以在HELP CALLHELP 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%

【讨论】:

    【解决方案3】:

    所有这些都对我有用:

    @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
    

    【讨论】:

      【解决方案4】:

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

      以下脚本在文件资源管理器的上下文菜单中展开 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 - 打开一个保持打开状态的命令 shell

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

      我希望这对某人有所帮助。

      【讨论】:

        【解决方案5】:

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

        @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”)也用于参数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 2010-10-01
          • 1970-01-01
          • 2016-06-19
          • 2018-09-29
          相关资源
          最近更新 更多