batch-file - 如何在批处理文件中不使用for循环分割字符串

标签 batch-file

我想将字符串分成两部分,而不使用任何 for 循环。

例如,我在变量中有字符串:

str=45:abc

我想在一个变量中获取 45 并在另一个变量中获取 abc 。可以在批处理文件中吗?

模式就像 somenumber:somestring

最佳答案

您可以用不同的方式拆分 str。

for循环,你不想使用它。

尾随部分很容易使用*(匹配任何内容,直到...)
设置“var2=%str:*:=%”

主角部分可以用令人讨厌的技巧来完成
设置“var1=%str::=”^&REM #%

需要插入符号来转义 & 符号,
因此,冒号将被有效地替换为 "&REM # 所以在你的情况下,你在更换后得到了这条线
设置“var1=4567”&REM #abcde
这被分成两个命令

set "var1=4567"
REM #abcde` 

完整的代码在这里:

set "str=4567:abcde"
echo %str%
set "var1=%str::="^&REM #%
set "var2=%str:*:=%"
echo var1=%var1% var2=%var2%

编辑2:更稳定的领先部分

感谢戴夫提出使用换行的想法。
REM 技术对于带有引号和特殊字符的内容不太稳定。
但是,通过换行技巧,存在一个更稳定的版本,当分割参数长于单个字符时,该版本也可以工作。

@echo off
setlocal enableDelayedExpansion
set ^"str=456789#$#abc"
for /F "delims=" %%a in (^"!str:#$#^=^

!^") do (
  set "lead=%%a"
  goto :break
)
:break
echo !lead!

解决方案 3:改编 dbenhams 答案

Dbenham 在他的解决方案中使用带有管道的换行。
这似乎有点过于复杂。
由于解决方案使用了这样一个事实,即解析器会删除未转义换行之后的行的其余部分(当在 special character phase 之前或中找到该换行时)。

首先,冒号字符被替换为具有延迟扩展替换的换行符。
这是允许的,换行符现在是变量的一部分。
然后,set Lead=%lead% 行将删除尾随部分。
最好不要在这里使用扩展语法,因为如果引号是字符串的一部分,set "lead=%lead%" 就会中断。

setlocal enableDelayedExpansion
set "str=45:abc"
set ^"lead=!str::=^

!"
set lead=%lead%
echo "!lead!"

关于batch-file - 如何在批处理文件中不使用for循环分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14620709/

相关文章:

batch-file - 如何通过批处理文件从文本文件中删除不需要的行?

batch-file - 我们可以从 RDS 实例运行 sqlcmd 吗?

windows - 在 Windows .bat 文件中使用 cd 没有效果

windows - BAT 文件 – 使用括号作为分隔符

batch-file - 在一个.bat文件中运行几个艰巨的任务

batch-file - 如何使用 .bat 文件运行传递 docker 终端命令

date - 如何通过为同一日期的所有文件创建一个存档来存档超过 7 天的文件?

windows - 如何在 Batch 中获取电池百分比?

Windows 批处理文件删除早于 X 天的文件,但保留最少的 X 个文件

windows - 批量合并单个制表符分隔文件中的 2 个 txt 文件