加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

我需要仅使用本机Windows命令在批处理环境变量中匹配或替换星号*

发布时间:2020-12-13 22:39:07 所属栏目:Windows 来源:网络整理
导读:我试图从环境变量字符串中删除星号,但似乎无法做到. 我正在创建一个基于搜索字符串的m3u文件,所以例如如果我想制作一个m3u文件,其中包含每个包含爱字的歌曲,我会输入: m3u *Love* 并且m3u.bat将创建该文件: xLovex.m3u 但是替换字符的常规方法不适用于星号
我试图从环境变量字符串中删除星号,但似乎无法做到.

我正在创建一个基于搜索字符串的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循环.

解决方案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功能.它的工作速度比任何基于批处理的函数都要快!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读