2

我想在 Windows Batch 中使用通配符和 SET 命令,因此我不必确切知道字符串中的内容以匹配它。

这可能吗?

如果这已经被问到并回答了,我很抱歉,我搜索了一段时间,但找不到。

4

2 回答 2

4

答:是的。但它并没有应有的强大。

但首先,让我们回答一个您(还没有)问过的问题,因为这是一个自然的后续问题。

问:问号会匹配批处理字符串搜索中的任何单个字符并替换为 SET 吗?
A:不,它是一个常规字符,并且只会匹配它自己。

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

有用的搜索:

*x  
*how are you?

上述两个搜索可以匹配。第一个将匹配所有内容,包括
它遇到的第一个“x”。第二个将匹配所有内容,包括第一个“你好吗?” 它发现。

合法但无用的搜索:

x*
Hello*
One*Three

上述三个搜索永远无法匹配。奇怪的是,它们也是合法的,不会导致错误。
一个例外:Hello* 和 x* 将匹配自己,但前提是它们是字符串的开头。(谢谢杰布!)

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

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

输出:“你好吗?”

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

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

从逻辑上讲, .* 应该匹配从句号开始的所有内容,导致字符串被截断为“你好我的朋友”。但是由于 * 只匹配从字符串的开头开始,所以 .* 什么都不匹配,所以字符串保持不变。

于 2012-07-27T08:21:49.693 回答
0

非常旧,但很有用

作为可执行文件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"
于 2017-10-05T02:08:53.473 回答