希望我能清楚我的问题以及我搜索的内容。我在.sjs文件中有一个长脚本(基本上是带有不同扩展名的txt),其中一部分是以下行。在下面的注释中,这可以称为input.txt或Builder.sjs
var Want_spring_aid_file_update = 0;
var Front_spring_aid_file = "name_1.pspck";
var Rear_spring_aid_file = "name_2.pspck";
我一直在寻找一个.bat脚本,它可以在这个.sjs文件中探测上面例子中的某些行,2和3,并在文本新文件中的双引号之间写入字符串。在下面的评论中,这个新的文本文件称为comments.txt。
我在这个了不起的网站上找到了一个脚本,它输出该文件中引号之间的所有字符串。我想要特定的线条。我正在谈论的剧本如下。
>"output.txt" (
for /f usebackq^ tokens^=2^ delims^=^" %%A in ("input.txt") do echo "%%A"
)
也有人可以帮助我理解上述脚本中某些字符的作用。这些是^,2 ^,^ = ^。
谢谢你们!
答案 0 :(得分:0)
带有选项/F
的命令 FOR 用于处理文件的行,或双引号中指定的单个字符串,或 FOR执行的命令行的输出在从后台命令进程的句柄 STDOUT 捕获的后台单独的命令进程中。
第一个选项usebackq
导致将双引号中指定的文件名解释为不处理的字符串,而是将 FOR 处理哪些行的文件的双引号名称解释
选项delims=
用于指定分隔符,用于将不以默认行尾字符;
开头的每个非空行拆分为一个或多个称为标记的子字符串。默认分隔符是空格和水平制表符。 delims=
没有任何字符意味着根本不分割线。只有双引号字符"
才能作为分隔符用于此任务。
选项tokens=
定义应将哪些子字符串分配给循环变量。默认情况下,只将第一个子字符串(标记)分配给指定的循环变量。通过指定tokens=2
,命令 FOR 被通知感兴趣的是应该分配给指定循环变量的第二个子字符串(第一个)。这意味着如果一行在一个或多个指定的分隔符后没有字符串,则该行也将被忽略。对于input.txt
的第一行,它根本不包含双引号字符。
在命令提示符窗口for /?
中运行,以获取有关多个页面上命令 FOR 输出选项的更多信息。
FOR 的选项通常用双引号括起来。
>"output.txt" (
for /F "usebackq tokens=2 delims="" %%A in ("input.txt") do echo "%%A"
)
但是这里的问题是将"
指定为分隔符。对于Windows命令解释器,选项字符串是"usebackq tokens=2 delims="
,这没有多大意义,因为这意味着不应将行拆分为令牌,然而只有第二个令牌才有意义。但是,下一个"
无效,因为预期接下来是循环变量,前面是百分号的单个字符。百分号必须在具有额外百分号的批处理文件中进行转义。
因此,有必要指定 FOR 的选项,而不用双引号将它们括起来。因此,在执行 FOR 命令行之前,必须确保在Windows命令解释程序的预处理阶段,将3个选项解释为单个参数字符串。
批处理文件中使用的转义字符是脱字符^
,它指示Windows命令解释程序将下一个字符解释为属于参数字符串的文字字符。必须使用%
而不是%
转义^
,才能将其解释为文字字符。
在最后一个输出帮助页面的最后一段上的命令提示符窗口cmd /?
中运行时可以读取它,目录/文件名(或其他参数字符串)中的字符需要用双引号括起该字符串:空格字符,&()[]{}^=;!'+,`~
字符,并未通过帮助提及不能在目录/文件名中使用的字符"|<>
。
因此,对于Windows命令解释器,使用usebackq^ tokens^=2^ delims^=^"
指定不应将带有异常文本usebackq tokens=2 delims="
的双引号括起来的参数字符串作为第二个命令传递给命令 FOR /F
之后的论据。
Windows命令解释程序解释空格字符和未使用^
转义的等号作为参数字符串之间的分隔符。
未使用^
转义的双引号被解释为参数字符串的开头,该字符串以另一个双引号结束,当延迟扩展为%
和!
之间的所有字符时enabled被解释为文字字符。
这就是为什么空格字符,等号和双引号必须在参数字符串^
中使用usebackq tokens=2 delims="
进行转义。
有关Windows命令解释程序解析命令行的更多详细信息,请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?。
答案 1 :(得分:0)
@Compo谢谢!经过一些试验和错误后,下面的代码就完成了。
@echo off
>>"comments.txt" (
for /f usebackq^ tokens^=2^ delims^=^" %%A in ( 'findstr /C:var Front_spring_aid_file = ^"part_name1^"; "Builder.sjs"') do echo %%A
)