Batch file 批处理文件以删除绝对路径,并在多个文件中仅保留文件名
我在这里忙得不可开交。我正在尝试编写一个.bat文件,它将遍历多个.m3u播放列表文件中的每一行,以删除路径并只保留文件名 输入示例:Batch file 批处理文件以删除绝对路径,并在多个文件中仅保留文件名,batch-file,variables,text,playlist,edt,Batch File,Variables,Text,Playlist,Edt,我在这里忙得不可开交。我正在尝试编写一个.bat文件,它将遍历多个.m3u播放列表文件中的每一行,以删除路径并只保留文件名 输入示例: C:\Users\username\Music\Dr. Dre\Dr. Dre & Snoop Doggy Dog - Ain't Nothin But A G-Thang.mp3 C:\Users\username\Music\Ed Sheeran\x (Deluxe Edition)\04 Don't.mp3 C:\Users
C:\Users\username\Music\Dr. Dre\Dr. Dre & Snoop Doggy Dog - Ain't Nothin But A G-Thang.mp3
C:\Users\username\Music\Ed Sheeran\x (Deluxe Edition)\04 Don't.mp3
C:\Users\username\Music\Eric Church\Chief (2011)\06-eric_church-homeboy.mp3
期望输出:
Dr. Dre & Snoop Doggy Dog - Ain't Nothin But A G-Thang.mp3
x (Deluxe Edition)\04 Don't.mp3
06-eric_church-homeboy.mp3
我到处寻找,却没有得到想要的结果。我也没有足够的经验来简化这件事。在我多次失败的尝试中,我得出了以下结论:
@echo off
setlocal enableDelayedExpansion
for /f "tokens=* delims= eol=~" %%G in ('dir /b "C:\Users\username\Documents\Playlists\*.m3u"') do (
SET Remove=*
SET Result=%Remove:*\=% )
ECHO %Result%
我尝试使用的方法是每行删除\
符号之前的所有内容。到目前为止,我已经能够让脚本在没有错误的情况下结束,但它实际上什么都没有做
任何帮助都将不胜感激。先谢谢你
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
for /f "delims=" %%G in ('dir /b /a-d "%sourcedir%\*.m3u"') do (
REM "%%G" contains the name+extension of each M3U file in turn
for /F "usebackq delims=" %%q in ("%sourcedir%\%%G") do (
rem %%q contains the entire contents of the file "%%G" - each such line is itself a full-filename
for /f "delims=" %%s in ("%%q") do echo %%~nxs
)
)>"%destdir%\%%~nxG"
GOTO :EOF
您需要更改sourcedir
和destdir
的设置以适应您的环境。清单使用了适合我的系统的设置
在第一行中,dir/b
输出被分配给元变量%%G
。如果遇到符合*.m3u
的目录名,则/a-d
开关将关闭目录名
“delims=“
将dir
输出的行分配给%%G
——整行,只分配该行。这些行是扫描目录时遇到的文件的名称
请注意。。。执行(..任何…)>“文件名”。这意味着将(..whatever..)
的任何输出收集到一个新文件中。(>
代替
将附加到现有文件,或者在没有现有文件的情况下创建新文件…)使用n
ame和eX
张力%%G
命名。如果您想要.txt
输出文件,而不是.M3u
(匹配%%G
中的扩展名),那么您只需使用%%~nG.txt
现在我们处理每个文件“%%G
”。由于名称可能包含空格,因此需要使用usebackq
选项。同样,delims=
将把从文件读取的整行分配给%%q
因此,%%q
是一个文件名。使用for/f
作为文本(通过“引用”
它)处理此过程,然后我们可以使用%%~nxs
来“显示”%%s的“名称和扩展名”
那么-你的版本出了什么问题
嗯,tokens=*
和delims=
基本上做了相同的事情(但是前者抑制了前导分隔符,比如空格)eol=~
会在~
之前截断从dir
输出的任何文件名,这可能实际上没有发生-这只是一个潜在的问题
在循环中,您正在设置remove
。这里有两个小问题。首先,最好使用语法SET“var=value”
(其中值可能为空;在这种情况下,var
变为未定义)来确保分配的值中不包含任何多余的尾随空格
其次,更严重的是,当您在下一行中使用Remove
时,将使用遇到for
时的Remove
值,因为您的代码使用%Remove…%
。要按预期使用当前值,需要启用delayedexpansion
(如您所用)并使用!删除代码>。即使在那里,您也会尝试将处理后的值分配给result
使用设置“remove=%%G”
会更好一些(这不是您想要的,因为%%G
是.m3u
文件的名称-不是它的内容,而是更好),然后您可以尝试将结果设置为包含所有前导字符(包括第一个“\”的“remove”内容替换为*无*
因此,如果正在处理的变量的内容如C:\Users\username\Music\Ed Sheeran\x(豪华版)\04 Don't.mp3
,那么结果只需删除C:\
然后-echo
ing%result%
将不会对echo
执行任何操作,因为当遇到for
时,result
没有任何值<代码>回声!结果
可能工作得更好一些(!
,因为该值已被循环修改)但随后
echo的参数解析为*nothing*reports
echo为off`(或on,视情况而定),而不是预期的空行
复杂,不是吗?Nevermind-一旦掌握了诀窍,批处理就很有趣。阅读for/?
的输出,并注意“修饰符”部分。文件名和扩展名都有一个修改器。或者使用普通的for
:for%%G in(“C:\Users\username\Documents\Playlists\*.m3u”)执行echo%%~nxG
如果您想使用该m3u文件的相对路径,那么我希望它驻留在C:\Users\username\Music
中并包含:第1行Dr.Dre\Dr.Dre&Snoop Doggy Dog-除了G-Thang.mp3之外什么都不是,第2行<代码>Ed Sheeran\x(豪华版)\04 Don't.mp3和第3行Eric Church\Chief(2011)\06-Eric_Church-homeboy.mp3
。因此,基于您的“期望输出”和M3U文件的位置,我最多只能期望其中一个工作。但是,由于您的播放列表都在C:\Users\username\Documents\playlists
中,删除这些内容将意味着该文件中的任何内容都不会播放!