如何使用cmd从特定行

时间:2017-08-14 15:39:31

标签: batch-file

希望我能清楚我的问题以及我搜索的内容。我在.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 ^,^ = ^。

谢谢你们!

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
)