Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件以删除绝对路径,并在多个文件中仅保留文件名_Batch File_Variables_Text_Playlist_Edt - Fatal编程技术网

Batch file 批处理文件以删除绝对路径,并在多个文件中仅保留文件名

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

我在这里忙得不可开交。我正在尝试编写一个.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\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和e
X
张力
%%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
中,删除这些内容将意味着该文件中的任何内容都不会播放!