如何在使用 Windows 批处理文件时替换来自 MediaInfo 元数据的星号

问题描述 投票:0回答:2

我正在使用 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:^*=_!"

我肯定错过了什么。

batch-file special-characters wildcard variable-expansion
2个回答
0
投票

被问过很多次。没有通用的解决方案 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
可能是一个解决方案。


0
投票

我的解决方案可能并不漂亮,但我终于让它起作用了。我将 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
)
© www.soinside.com 2019 - 2024. All rights reserved.