for循环多行 我只需要使用本地Windows命令来匹配或替换批处理环境变量中的星号*。 这可能吗?




bat变量 (2)

简单的答案是否定的。

您遇到的问题源于星号*是与SET搜索和替换方法一起使用时的特殊字符。 它以有限但仍然有用的方式匹配多个字符。 你可以在这里了解到。

答案是肯定的

我会为您提供两个解决方案。 一个不完整的解决方案,但elegent,另一个完整和inelegent。

两种方法都会搜索*并用x替换。
这两种方法都将搜索和修改以下字符串:

*love*

首先想到的方法是使用'FOR / L'语句,并且要求您知道环境变量有多少个字符。

::主要编辑::

我以为我知道环境变量的各种最大尺寸的字符串,但是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*
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

我认为这是一个快速和优雅的解决方案它可以通过添加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

特别感谢dbenham指出strLen函数。 它比任何基于批处理的功能都有权利快!

我试图从环境变量字符串中删除星号,但似乎无法做到这一点。

我正在创建一个基于搜索字符串的m3u文件,例如,如果我想要制作一个m3u文件,其中包含每首歌都带有“love”字样,那么我会输入:

m3u *Love*

而m3u.bat会创建这个文件:

xLovex.m3u

但是替换字符的常规方法不适用于星号。 (虽然我没有问号的问题。)

set nam=%nam:*=x%.m3u

而是创建文件名

x.m3u

看到这个答案 ,用set-ast.bat你可以在需要的时候在你的文件中放置set-ast nam "x"

set-ast接受参数<variable-to-modify> <string-to-replace-asterisks-with>





replace