我想在Windows批处理中使用SET命令的通配符,所以我不必确切地知道string中的内容以匹配它

我想在Windows批处理中使用SET命令的通配符,所以我不必确切地知道string中的内容是否与之匹配。

这可能吗?

如果这已经被问及回答,我表示抱歉,我search了一段时间,但找不到它。

答:是的。 但它并不像它应该那样强大。

但首先,我们来回答一个你没有问的问题,因为这是一个自然的后续问题。

问:问号是否与批次字符串搜索中的任何单个字符匹配,并用SET替换?
答:不可以。这是一个普通的字符,只会匹配它自己。

星号一个通配符,并且会匹配多个字符,但只会匹配从字符串最开始的所有内容。 不是在中间,而不是从最后。

有用的搜索:

*x *how are you? 

以上两个搜索可以匹配。 第一个匹配一切,包括第一个“x”
“它贯穿其中,第二个将匹配所有的东西,包括第一个”你好吗?“它发现。

合法但无用的搜索:

 x* Hello* One*Three 

以上三个搜索都不能匹配。 奇怪他们也是合法的,不会造成任何错误。
有一个例外:Hello *和x *会自己匹配,但只有在字符串的开头。 (谢谢Jeb!)

您可以在命令提示符下键入或粘贴两个示例:

REM一个成功的搜索和替换。
SET X =你好我的朋友。 你好吗?
SET X =%X:*。=%
ECHO输出:“%X%”

输出:“你好吗?

REM意外的操作导致搜索和替换失败。
SET X =你好我的朋友。 你好吗?
SET X =%X:。* =%
ECHO输出:“%X%”

输出:“你好,我的朋友,你好吗?”

Logiclly,。*应该与上一个句点相同,导致字符串被截断为“Hello my friend”。 但是由于*只匹配字符串的开头,。*不匹配,因此字符串保持不变。

非常古老,但有用

作为一个可执行的set-ast

 set string=abc*def*ghi set-ast string "-dash-" :: -> "abc-dash-def-dash-ghi" 

参数以set-ast <variable-name> <replacement-string>


-dash-替换* (仅限一次)

注意: 必须启用延迟扩展

 set string=abc*def :: -> "abc*def" set right=%string:**=% :: -> "def" set left=!string:%right%=! :: -> "abc*" set left=%left:~0,-1% :: -> "abc" set new-string=%left%-dash-%right% :: -> "abc-dash-def"