【问题标题】:Different FOR loop executions for the same pattern相同模式的不同 FOR 循环执行
【发布时间】:2013-03-06 13:54:13
【问题描述】:

我正在编写两个 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")

【问题讨论】:

  • 我们可以看看你的代码吗?
  • 第一组代码行(需要按空格键...):rem Parcours des fichiers CSV Stocks en sautant la 1ere ligne :: :: for %%x in (.\req*. csv) do ( echo %%x ... :: for /f "skip=1 usebackq delims=" %%l in ("%%x") do (echo %%l >>tmpStock) 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") :: set file=Stock.txt set /a cnt=0 for /f %%a in ('type "%file%"^ |find "" /v /c') 设置 /a cnt=%%a echo %cnt%,lignes, dans %file% ! >>ComptageLignes.txt
  • 如何编辑您的主要问题并将其放入代码块中?
  • 解决问题。我下面的回答有帮助吗?如果没有,请尝试在脚本顶部标记@echo off,看看您是否能分辨出脚本在哪一行暂停并等待空格键。
  • @rojo 当通过 msg L'ajout de 等提示等待时。我检查了 Stock 内容...我阅读了 Suite 99% 这似乎是文件长度所以我会有相同的大文件的问题。 PS:提示停在65535行...

标签: windows batch-file


【解决方案1】:

我想这就是解决方案。

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

*耸耸肩*

【讨论】:

  • 我已经尝试了您建议的 2 个解决方案...没有任何改进。您的代码有效,但仍需要按空格键。这可能是文件长度造成的吗?
  • 不确定。它会在more 命令处暂停吗?如果是这样,请尝试将其替换为 echo; | more +1 "%%F" >>Stock.txt 并查看是否通过管道将回声修复它。我刚刚修改了上面的脚本来显示这一点。如果这不起作用,那么您可能必须使用另一个 for 循环将文件转储到 stock.txt 中。或者只使用type "%%F" >>stock1.txt 然后使用findstr /v "lines_to_skip" stock1.txt >stock.txt 删除您不想要的行可能更容易。无论如何,有一个解决方案。我们将继续试验,直到找到为止。
  • 更多+1代码处理分页,所以在批处理文件中不容易使用....太糟糕了!
  • 这是否意味着echo; | more 不起作用?每个 .csv 文件的第一行是什么样的,你想跳过的那一行?每个 .csv 文件都相似吗?
  • @rojo - 你还没有解决根本问题。请参阅my answer 了解为什么重定向的 MORE 仍然可以暂停。
【解决方案2】:

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 实用程序对于批量开发很有用。

【讨论】:

  • @rojo - 谢谢 :) 我发现混合 JScript/Batch 是编写实用程序脚本的好方法。我最喜欢的是 REPL.BAT,一个执行正则表达式搜索和替换的过滤器脚本。它内置了 许多 选项,令人惊讶的是,使用这个小实用程序可以轻松解决许多棘手的批处理问题。只需在 StackOverflow 上执行以下搜索,即可查看我使用 REPL.BAT 解决的各种问题的列表:user:1012053 REPL.BAT。我在每个答案中都包含了 REPL.BAT 代码。
  • @dbenham 感谢这些行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多