我有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)或任何关于如何在本网站上提问的正确礼仪。
答案 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文件中读取的每一行,并将每个非空行拆分为两个字符串:
由于A
tokens=1
,File
,ShortName
以及{{1},因此元素名称已分配给循环变量Path
应该忽略最后一个,这就是为什么在分隔符列表中没有指定/File
的原因。
由于/
,空格之后的剩余行或>
之后的元素名称被分配给B
之后ASCII表中的下一个字符的下一个循环变量A
附加在*
之后的例子:
tokens=1
接下来会对循环变量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 /?