我正在使用 mediainfo 从音频文件中提取元数据,然后使用其信息生成文件夹树。由于此元数据允许使用星号等特殊字符,因此无法生成文件夹。我似乎无法使用此脚本替换星号。我相信这可能与
*
是通配符这一事实有关。对我有什么想法或问题吗?
[mcve]
@echo off
setlocal enabledelayedexpansion
set "album_name=Make Sh*t Happen"
set "album_folder=!album_name:*=_!"
set album_folder
endlocal
我期待以下结果:
album_folder=Make Sh_t Happen
我尝试了各种不同的方法来尝试更换
*
,但无济于事。
set "album_folder=!album_folder:^*=_!"
我肯定错过了什么。
被问过很多次。没有通用的解决方案 afaiaa.
你可以使用这样的东西:
SETLOCAL
SET "string=hello*this&is*a*string"
:loop
FOR /f "tokens=1*delims=&*" %%b IN ("%string%") DO IF "%%c" neq "" SET "string=%%b_%%c"&GOTO loop
SET str
它并不完美,但可能足以满足您的应用。
OTT,如果您能够使用 3rd 方实用程序,那么
sed
或 (g)awk
可能是一个解决方案。
我的解决方案可能并不漂亮,但我终于让它起作用了。我将 mediainfo 元数据导出到一个 txt 文件,然后用 PowerShell 替换星号。还有一个 PowerShell 命令可以修剪 txt 文件行尾的任何空格。
for /f "delims=" %%b in ('%~dp0tools\mediainfo "--Inform=General;%%Performer%%" "%%a" 2^>nul') do (
echo %%b > %~dp0tools\artist_name.txt && powershell -command "(get-content %~dp0tools\artist_name.txt) -replace '[\x2A]+', '_' | foreach { $_.TrimEnd() } | set-content %~dp0tools\artist_name.txt"
set /p artist_name=<%~dp0tools\artist_name.txt
)