针对相同模式的不同FOR循环执行

时间:2013-03-06 13:54:13

标签: windows batch-file

我正在编写两个FOR循环来使用通配符为其名称连接文件。 我使用更多+1命令(跳过第1行),a>用于提供临时文件的符号和
最后,我将最终文件移动到一个新的扩展文件中(实际上重命名该文件)。

我不明白为什么第一个循环需要一个空格键才能对每个文件进行操作 而没有必要为几个文件击中第二个循环!!!

我在批处理文件的第一行放了@ECHO OFF。

奇怪的行为:我在第一个循环中写了一条ECHO消息来执行每个命令。 如果我删除(或将此ECHO消息作为注释),则循环不起作用。

有关错误操作的任何建议吗?

谢谢。

代码示例:

for %%x in (.\req*.csv) do (
  echo %%x ... 
  more +1 "%%x" >tmpStock
  move /y tmpStock "%%x".sse)

for %%F in (req*.csv.sse) do (type "%%F" >>Stock.txt)
for %%F in (req*.csv.sse) do (DEL /Q "%%F")

2 个答案:

答案 0 :(得分:1)

我想这就是解决方案。

type req*.csv>tempfile
findstr /v /i /c:"unwanted text" tempfile>Stock.txt
del tempfile

*耸肩*

答案 1 :(得分:1)

每次显示全屏幕信息时,MORE命令通常会暂停。但是如果输出被重定向或管道输出,那么它在每个屏幕后都不会暂停。不幸的是,它不会继续打印,直到文件结束。如果输出被重定向或管道输出,它将在~64k行(~65535)之后暂停。

您可以使用FOR / F循环处理除第一行以外的所有行,但这相对较慢。

我编写了一个名为SKIP.BAT的简单混合JScript / Batch实用程序,可用于从文件中跳过 n 行。它可以作为过滤器使用,并且比纯批量FOR循环快得多。只需管道数据,它将跳过您指定的行数。该脚本当然可以改进。例如,它没有任何错误检查。

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Batch portion ***********
@echo off
cscript //E:JScript //nologo "%~f0" %*
exit /b 0

************* JScript portion **********/
for (var i=0; i<WScript.Arguments.Item(0); i++) {
  if (!WScript.StdIn.AtEndOfStream) WScript.StdIn.ReadLine();
}
while (!WScript.StdIn.AtEndOfStream) {
  WScript.Stdout.WriteLine(WScript.StdIn.ReadLine());
}

只要上面的脚本在您当前的目录中,或者在您的PATH中,那么您的代码可以缩减为:

@echo off
>Stock.txt (for %%F in (req*.csv) do type "%%F" | skip 1)

或者,从命令行:

>Stock.txt (for %F in (req*.csv) do @type "%F" | skip 1)

当然,整个解决方案可以在纯JScript或VBScript中轻松编写。或者CSV连接可以集成到一个Hybrid脚本中。但是,使用独立的SKIP实用程序对批量开发很有用。