我正在创建一个基于搜索字符串的m3u文件,所以例如如果我想制作一个m3u文件,其中包含每个包含爱字的歌曲,我会输入:
m3u *love*
并且m3u.bat将创建该文件:
xlovex.m3u
但是替换字符的常规方法不适用于星号. (虽然我对问号没有这个问题.)
set nam=%nam:*=x%.m3u
而是创建文件名
x.m3u
解决方法
您遇到的问题源于星号*在与SET搜索和替换方法一起使用时是一个特殊字符.它以有限但仍然有用的方式匹配多个字符.你可以了解here.
答案是肯定的!
我会为您提供两种解决方案.一个不完整的解决方案但是很好,
另一个完整而无益的.
两种方法都将搜索*并将其替换为x.
这两种方法都将搜索和修改以下字符串:
*love*
想到的第一种方法是使用’FOR / L’语句,并要求您知道环境变量的长度.
::Major Edit::
I thought I knew the varIoUs maximum size strings of environmental variables,but dbenham has taken me to school,shown me a 07001,and in the mean time completely reversed my opinions of the two solutions I’m presenting.
Other than for the Windows 95/98/ME limitation of a 256 Character maximum environmental variable size. It seems that all versions of Windows using CMD.EXE have a limitation of 8,192 characters,well below what the documentation suggests.
两个版本都需要延迟环境变量扩展,但原因有两个.一个是因为我在FOR语句中运行.另一个是因为你不能将%对放在另一个%对中,因为命令处理器匹配它遇到的第一个%它遇到的第一个%,但是我们需要在另一个变量表达式中使用一个变量. (你会看到的.)
这个解决方案使用DosTips.com中的strLen函数(第3行),可以在Here找到它.只需将它打成一个名为strLen.bat的文件,并对它的速度感到惊讶!
解决方案1 :( FOR / L解决方案)::首选解决方案::
setlocal ENABLEDELAYEDEXPANSION set nam=*love* call strLen nam len for /l %%x in (0,1,%len%) do if not "!nam:~%%x,1!"=="" if "!nam:~%%x,1!"=="*" ( set /a plusone=%%x+1 for /l %%y in (!plusone!,!plusone!) do ( set nam=!nam:~0,%%x!x!nam:~%%y! ) ) echo %nam% ENDLOCAL我认为这是一个快速而优雅的解决方案可以通过将strLen.bat的内容添加到例程中来加快速度,但我不希望对作者产生混淆.
如果由于某种原因,您不希望使用strLen,那么下一个最快的方法可能会使用GOTO循环.
setlocal ENABLEDELAYEDEXPANSION set nam=*love* set num=0 :loop set /a plusone=%num%+1 if "!nam:~%num%,1!"=="*" set nam=!nam:~0,%num%!x!nam:~%plusone%! set /a num=%num%+1 if not "!nam:~%num%,1!"=="" goto :loop echo %nam% EndLocal