【发布时间】:2015-09-21 08:04:59
【问题描述】:
是否可以定义不限于 1 个字符的分隔符?根据标题的示例,我想将分隔符定义为例如 '#+#'。文本文件/行可以同时包含这两个字符,但您遇到特定子字符串/文本组合的可能性很小。
【问题讨论】:
-
for的分隔符?不,只有单个字符是可能的。csv的分隔符?据我所知,Excel 也只支持单字符分隔符
标签: windows batch-file cmd
是否可以定义不限于 1 个字符的分隔符?根据标题的示例,我想将分隔符定义为例如 '#+#'。文本文件/行可以同时包含这两个字符,但您遇到特定子字符串/文本组合的可能性很小。
【问题讨论】:
for 的分隔符?不,只有单个字符是可能的。 csv 的分隔符?据我所知,Excel 也只支持单字符分隔符
标签: windows batch-file cmd
不,您不能在delims= 子句中使用字符串 作为分隔符。当然你可以包含字符串,但它会被当作一组单独的字符来处理,这些字符将用作分隔符,而不是分隔符字符串。
如果你真的需要对字符串进行拆分,最快的方法是用数据中不包含的字符替换分隔符字符串,并使用该字符作为分隔符
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "delims=" %%a in ("this is a +test!! #+# of string #splitting#") do (
set "buffer=%%a"
setlocal enabledelayedexpansion
(for /f "tokens=1,2 delims=¬" %%b in ("!buffer:#+#=¬!") do (
endlocal
echo full line : [%%a]
echo first token : [%%b]
echo second token : [%%c]
)) || if "!!"=="" endlocal
)
注意:需要setlocal enabledelayedexpansion 才能读取在for 循环中更改的变量以检索数据(此处模拟直接包括字符串)。然后,在标记读取行的for 循环内,禁用延迟扩展以避免! 字符出现问题(如果延迟扩展处于活动状态,它们将被解析器消耗)。这就是循环内endlocal 的原因。
由于我们正在进行字符串替换,并且可能以仅由分隔符组成的字符串结尾,因此内部for的do子句可能不会被执行,因此最终的if包括在内以确保取消enabledelayedexpansion。
【讨论】:
endlocal:所以for 设置ErrorLevel 如果它的主体从未被执行?
errorlevel 变量,但在cmd 中,大多数命令都被编码为返回退出成功的函数/失败值,条件执行运算符使用此值来确定代码执行。如果for /f 没有遍历任何行,则其关联函数将返回失败代码但不会设置errorlevel。您可以在this question 中找到有关此行为的更多信息。至少阅读 dbenham、eryksun 和我自己的答案的答案(这是逻辑顺序)。
我最近发现了一个有趣的技巧,它允许使用多字符串作为分隔符,以非常简单的方式拆分较大的字符串;该方法不使用任何for 命令,而是在一行中执行拆分! 这里是:
@echo off
set "str=this is a +test!! #+# of string #splitting#"
set "first=%str:#+#=" & set "last=%"
echo full line : [%str%]
echo first token : [%first%]
echo last token : [%last%]
此方法还允许将一个大字符串拆分为多个部分并将所有这些部分存储在一个数组中。更多详情dos batch iterate through a delimited string
【讨论】:
%variable% 扩展的固有限制:( set "var=Not works" & echo %var% )。你可以EnableDelayedExpansion 然后使用( set "var=Works" & echo !var! )