我想在 Windows Batch 中使用通配符和 SET 命令,因此我不必确切知道字符串中的内容以匹配它。
这可能吗?
如果这已经被问到并回答了,我很抱歉,我搜索了一段时间,但找不到。
我想在 Windows Batch 中使用通配符和 SET 命令,因此我不必确切知道字符串中的内容以匹配它。
这可能吗?
如果这已经被问到并回答了,我很抱歉,我搜索了一段时间,但找不到。
答:是的。但它并没有应有的强大。
但首先,让我们回答一个您(还没有)问过的问题,因为这是一个自然的后续问题。
问:问号会匹配批处理字符串搜索中的任何单个字符并替换为 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%”输出:“你好,我的朋友。你好吗?”
从逻辑上讲, .* 应该匹配从句号开始的所有内容,导致字符串被截断为“你好我的朋友”。但是由于 * 只匹配从字符串的开头开始,所以 .* 什么都不匹配,所以字符串保持不变。
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"