如何在Windows批处理文件中替换MediaInfo元数据中的星号
批处理替换音频元数据中的星号失败问题
我用MediaInfo提取音频文件的元数据,打算用这些信息生成文件夹目录,但元数据里包含星号这类特殊字符,导致无法创建文件夹。尝试用批处理脚本替换星号却一直失败,推测是因为星号在批处理里是通配符的缘故。
最小可复现示例
@echo off setlocal enabledelayedexpansion set "album_name=Make Sh*t Happen" set "album_folder=!album_name:*=_!" set album_folder endlocal
实际运行结果
album_folder=_
期望结果
album_folder=Make Sh_t Happen
我试过多种方法替换星号都无效,比如:
set "album_folder=!album_folder:^*=_!"
解决方法
批处理的变量替换语法中,*作为第一个字符时会被当作通配符,匹配变量开头的所有内容,所以直接用!var:*=_!会把整个变量替换成_,这就是你失败的原因。下面提供两种可靠的解决方式:
方法1:借助PowerShell替换
利用PowerShell的正则替换功能,可以轻松处理星号这类特殊字符,兼容性良好:
@echo off setlocal enabledelayedexpansion set "album_name=Make Sh*t Happen" :: 用PowerShell将所有*替换为_ for /f "delims=" %%a in ('powershell -Command "$env:album_name -replace '\*', '_'"') do set "album_folder=%%a" set album_folder endlocal
方法2:纯批处理字符替换
如果不想依赖PowerShell,可以用临时标记中转的方式实现:
@echo off setlocal enabledelayedexpansion set "album_name=Make Sh*t Happen" :: 先把*替换为临时标记(这里用#,可换成元数据中不存在的字符) call set "album_folder=%%album_name:*=#%%" :: 再把临时标记替换为_ set "album_folder=!album_folder:#=_!" set album_folder endlocal
内容的提问来源于stack exchange,提问作者Gatorman
相关产品推荐
相关产品推荐

