如何在批处理文件的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
,因为这使我可以始终将要读取的文件名双引号,从而保护其名称和/或路径中的任何空格或有问题的字符。对于Delims
和EOL
选项,我还使用了一种带有插入符号^
转义的奇怪方法。这是因为For /F
循环总是排除任何以分号开头的行,;
。此方法将“开始”字符定义为无,并允许读取每一行,而不考虑其第一个字符。请注意,空行也总是从输出中排除。
【讨论】:
感谢 Compo 的慷慨分享!多谢。不幸的是,由于我的新鲜感,我的赞成票没有显示在这里:( 如果答案已经解决了你的问题,你不赞成它,你接受它。您只需单击所选答案左侧的灰色大复选标记即可。以上是关于如何在批处理文件的for循环中提取子字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章