使用XML文件中的文件名来组织声音文件的批处理脚本

时间:2016-08-29 17:16:05

标签: xml batch-file batch-rename

我有ID命名的声音文件。找到声音的唯一方法是翻阅每个文件名的参考库。

我想要实现的是一个可以找到ID的脚本,以及' Path'重命名文件并组织所述文件。

以下是XML中包含声音信息的数据:

<File Id="14518742" Language="SFX">
        <ShortName>Creatures\Fish_Large_Swim_03.wav</ShortName>
        <Path>SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path>
</File>

任务要求:查找标识为<file ...的{​​{1}},例如14518742。我想将文件移动到14518742.ogg中存储的目录:

<Path>

由于无能,我甚至无法获得身份证明:

SFX\Creatures\Fish_Large_Swim_03_9344E057

我无法解决试图修剪字符串的问题,我只设法使用分隔符。即便如此,我可能无法完成此任务。

编辑#2:修改因为&#34;搁置过于宽泛&#34;因为它太长了而浓缩了它。我会道歉,因为我不太了解脚本(至少有CMD)或任何关于如何在本网站上提问的正确礼仪。

1 个答案:

答案 0 :(得分:1)

您可以使用目录中执行的以下批处理代码和所有* .ogg文件,并且还包含文件XmlFile.xml和XML数据:

注意:第三行<之后的>delims=之间的字符必须是水平制表符。浏览器根据HTML标准显示和复制制表符作为单个空格字符。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq tokens=1* delims=< > " %%A in ("XmlFile.xml") do (
    if "%%A" == "File" (
        for /F "tokens=2 delims== " %%C in ("%%B") do set "OggFileName=%%~C.ogg"
    ) else if "%%A" == "Path" (
        set "TargetPath=%%B"
        set "TargetPath=!TargetPath:~0,-11!"
        for /F "delims=" %%F in ("!TargetPath!") do set "NewFileName=%%~nxF.ogg"
        if not exist "!TargetPath!" md "!TargetPath!"
        if exist "!OggFileName!" (
            move /-Y "!OggFileName!" "!TargetPath!\!NewFileName!"
        ) else (
            echo There is no file !OggFileName! in folder %CD%.
        )
    )
)
endlocal

最外层的 FOR 处理从XML文件中读取的每一行,并将每个非空行拆分为两个字符串:

  1. 由于A tokens=1FileShortName以及{{1},因此元素名称已分配给循环变量Path应该忽略最后一个,这就是为什么在分隔符列表中没有指定/File的原因。

  2. 由于/,空格之后的剩余行或>之后的元素名称被分配给B之后ASCII表中的下一个字符的下一个循环变量A附加在*之后的例子:

    tokens=1
  3. 接下来会对循环变量Id="14518742" Language="SFX"> Creatures\Fish_Large_Swim_03.wav</ShortName> SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path> 的值进行区分大小写的比较,以识别需要处理的那些行。

    元素名称为A的行包含属性File值的* .ogg文件的文件名。另一个 FOR 用于将使用等号和空格字符作为分隔符分配给循环变量Id的字符串。

    从字符串B开始,感兴趣的是等号之后的第二个子字符串Id="14518742" Language="SFX">,这是使用"14518742"的原因。此字符串不带双引号且附加tokens=2,将分配给环境变量.ogg供以后使用。

    另一个感兴趣的元素是OggFileName,其中包含文件夹路径以及* .ogg文件的文件名。

    因此,从分配给循环变量Path的字符串SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path>开始,最后删除最后11个字符以获取目标文件夹路径字符串B

    再次使用命令 FOR 将最后一个反斜杠后的字符串分配给环境变量SFX\Creatures\Fish_Large_Swim_03_9344E057,该字符串应该是* .ogg文件的新文件名。因为在使用NewFileName之前已经删除了读取扩展名.wem而不是仅仅%%~nxF,因为文件名包含一个点,该点在已截断的文件名称上解释为文件扩展名分隔符

    接下来,如果目录尚未存在,则创建目录,并且如果当前目录中存在新文件名,则将* .ogg文件移动到此目录中。

    要在保留ID作为文件名的情况下移动文件,请使用下面的批处理代码,该代码仅用于确定环境变量%%~nF的文件名,并使用命令延迟对此环境变量的扩展引用与上述批次代码相比,移除了

    NewFileName

    要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

    • @echo off setlocal EnableExtensions EnableDelayedExpansion for /F "usebackq tokens=1* delims=< > " %%A in ("XmlFile.xml") do ( if "%%A" == "File" ( for /F "tokens=2 delims== " %%C in ("%%B") do set "OggFileName=%%~C.ogg" ) else if "%%A" == "Path" ( set "TargetPath=%%B" set "TargetPath=!TargetPath:~0,-11!" if not exist "!TargetPath!" md "!TargetPath!" if exist "!OggFileName!" ( move /-Y "!OggFileName!" "!TargetPath!\" ) else ( echo There is no file !OggFileName! in folder %CD%. ) ) ) endlocal
    • echo /?
    • endlocal /?
    • for /?
    • if /?
    • move /?
    • set /?