Jam*_*s K 6 windows replace cmd batch-file
我试图从环境变量字符串中删除星号,但似乎无法做到.
我正在创建一个基于搜索字符串的m3u文件,所以例如如果我想制作一个m3u文件,其中包含每个包含爱字的歌曲,我会输入:
m3u *Love*
Run Code Online (Sandbox Code Playgroud)
并且m3u.bat将创建该文件:
xLovex.m3u
Run Code Online (Sandbox Code Playgroud)
但是替换字符的常规方法不适用于星号.(虽然我对问号没有这个问题.)
set nam=%nam:*=x%.m3u
Run Code Online (Sandbox Code Playgroud)
而是创建文件名
x.m3u
Run Code Online (Sandbox Code Playgroud)
Jam*_*s K 11
简单的答案是否定的.
您遇到的问题源于星号*在与SET搜索和替换方法一起使用时是一个特殊字符.它以有限但仍然有用的方式匹配多个字符.你可以在这里了解这一点.
答案是肯定的!
我会为您提供两种解决方案.一个不完整的解决方案,但是优雅,另一个完整和不敏感.
两种方法都将搜索*并将其替换为x.
这两种方法都将搜索和修改以下字符串:
*love*
Run Code Online (Sandbox Code Playgroud)
想到的第一种方法是使用'FOR/L'语句,并要求您知道环境变量的长度.
:: Major Edit ::
我以为我知道环境变量的各种最大尺寸字符串,但dbenham带我上学,向我展示了一个背后的长度函数,同时完全颠倒了我对这两种解决方案的看法我是呈现.
除了Windows 95/98/ME限制256字符最大环境变量大小.似乎所有使用CMD.EXE的Windows版本都有8,192个字符的限制,远低于文档建议的内容.
两个版本都需要延迟环境变量扩展,但原因有两个.一个是因为我在FOR语句中运行.另一个是因为你不能将%对放在另一个%对中,因为命令处理器匹配它遇到的第一个%它遇到的第一个%,但我们需要在另一个变量表达式中使用一个变量.(你会看到的.)
此解决方案使用DosTips.com中的strLen函数(第3行),该函数可在此处找到.把它打成一个名为strLen.bat的文件,然后对它的速度感到惊讶!
解决方案1 :( FOR/L解决方案)::首选解决方案::
setlocal ENABLEDELAYEDEXPANSION
set nam=*love*
rem calling strLen
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!, 1, !plusone!) do (
set nam=!nam:~0,%%x!x!nam:~%%y!
)
)
echo %nam%
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)
我认为这是一个快速而优雅的解决方案可以通过将strLen.bat的内容添加到例程中来加快速度,但我不希望对作者产生混淆.
如果由于某种原因,您不希望使用strLen,那么下一个最快的方法可能会使用GOTO循环.
解决方案2 :(转到解决方案)
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
Run Code Online (Sandbox Code Playgroud)
特别感谢dbenham指出了strLen功能.它的工作速度比任何基于批处理的函数都有权利!