0

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

我不明白为什么第一个循环需要一个空格键来操作每个文件,而第二个循环不需要几个文件!

我在批处理文件的第一行放置了一个@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")
4

2 回答 2

1

我想这就是解决方案。

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

*耸耸肩*

于 2013-03-06T14:38:00.393 回答
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 连接可以集成到一个混合脚本中。但是拥有一个独立的 SKIP 实用程序对于批量开发很有用。

于 2013-03-06T16:05:48.853 回答