如何在批处理文件的for循环中提取子字符串[关闭]

Posted

技术标签:

【中文标题】如何在批处理文件的for循环中提取子字符串[关闭]【英文标题】:How to extract a a substring in a within a for loop in a batch file [closed] 【发布时间】:2020-07-02 11:05:51 【问题描述】:

我找到了很多相关的查询,但没有一个能够解决这个确切的问题,我很遗憾我被卡住了。 我有一个 txt 文件,其中包含一个字符串列表,这些字符串的开头和结尾都是我需要抓取的 23 个字符,最后是我需要丢弃的双引号。

从各种示例中,我得到了以下草稿,但字符串提取(在顶部有效,在 for 语句中使用时失败:

set a=This message needs changed. 
echo caput
echo %a% 
rem set i=globalvariableastest
set a=%a:~-9% 
echo %a%

pause

echo "now for file"


for /F "tokens=*" %%i in (ioschi.txt) do (
SETLOCAL EnableDelayedExpansion
echo %%i
set j=%%i
echo !j!
set k="!j!:~-23!"
echo !k!
)

pause
code here

虽然在顶部的非递归部分我得到了预期的剪辑,但在 for 语句中得到的回声是

"full string:~-23!"

非常感谢您就如何在 for 语句中运行字符串提取提供帮助!

【问题讨论】:

【参考方案1】:

您的问题实际上只是一个不需要的附加 ! 字符,set k="!j!:~-23!" 应为 Set "k=!j:~-23!"。您会注意到我没有在变量值中包含硬编码的封闭双引号,更好的做法是根据需要在使用中的变量双引号。

这是我通常执行此类任务的方式,即输出文件中每个非空行的最后 23 个字符:

@For /F UseBackQDelims^=^ EOL^= %%I In ("ioschi.txt")Do @(
    Set "line=%%I"
    SetLocal EnableDelayedExpansion
    Echo "!line:~-23!"
    EndLocal
)
@Pause

我使用了UseBackQ,因为这使我可以始终将要读取的文件名双引号,从而保护其名称和/或路径中的任何空格或有问题的字符。对于DelimsEOL 选项,我还使用了一种带有插入符号^ 转义的奇怪方法。这是因为For /F 循环总是排除任何以分号开头的行,;。此方法将“开始”字符定义为无,并允许读取每一行,而不考虑其第一个字符。请注意,空行也总是从输出中排除。

【讨论】:

感谢 Compo 的慷慨分享!多谢。不幸的是,由于我的新鲜感,我的赞成票没有显示在这里:( 如果答案已经解决了你的问题,你不赞成它,你接受它。您只需单击所选答案左侧的灰色大复选标记即可。

以上是关于如何在批处理文件的for循环中提取子字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中使用for循环提取多个子字符串

批处理:如何在 FOR 循环中附加字符串

如何通过在 Windows 中使用批处理替换子字符串来重命名文件 [关闭]

如何在 for 循环中提取 JSON 文件的元素

for循环内的多处理

如何提取for循环的主体? [复制]