【问题标题】:Infinite loop with for on files in directory(batch, cmd)无限循环与目录中的文件(批处理,cmd)
【发布时间】:2017-10-31 18:25:00
【问题描述】:

我有一个具体的问题,我找不到。

有一个文件夹,里面是.txt文件,采用cp866编码,结构如下:

directory
‐‐2004_lpq.txt
--2006_lpq_jargon.txt
--barlou.txt

我需要在不更改文件名和目录结构的情况下将所有.txt文件转换为utf-8

这是我的代码:

@echo off

for /r %1 %%f in (*.txt) do (
    iconv -c -f cp866 -t utf-8  %%f > %%f.temp 
    echo converted %%f
    move %%f.temp %%f 
)

我如何运行脚本:

converter.cmd directory

输出:

converted "E:\YandexDisk\Учеба\OS\CMDProblem\directory\2004_lpq.txt"
Moving files:         1.
converted "E:\YandexDisk\Учеба\OS\CMDProblem\directory\2006_lpq_jargon.txt"
Moving files:         1.
converted "E:\YandexDisk\Учеба\OS\CMDProblem\directory\barlou.txt"
Moving files:         1.
converted "E:\YandexDisk\Учеба\OS\CMDProblem\directory\2004_lpq.txt"
Moving files:         1.
converted "E:\YandexDisk\Учеба\OS\CMDProblem\directory\2006_lpq_jargon.txt"
........

在其他机器上它工作正常。可能是什么问题?

【问题讨论】:

  • .temp 文件被移动并重命名为.txt 时,它会再次被For 括号内的*.txt 拾取。您最好在For 循环之外执行Moves。
  • 我想过,但在其他计算机上工作是正确的!有点奇怪。
  • 是的。此行为取决于几个细节,包括每台计算机中文件系统的类型。最简单的解决方案是将您的for /r %1 %%f in (*.txt) do ( 命令更改为等效的for /F "delims=" %%f in ('dir /S /A-D /B %1\*.txt') do ( 命令,其中dir 命令在处理任何文件之前只弹出一次...

标签: loops batch-file cmd infinite


【解决方案1】:

正如 Compo 建议的那样,最好将临时文件放在当前目录之外。如果文件名包含空格等特殊字符,最好也引用文件名。

for /r %1 %%f in (*.txt) do (
    iconv -c -f cp866 -t utf-8  "%%~f" > "%TEMP%\%%~f.temp"
    echo converted "%%~f"
    move "%TEMP%\%%~f.temp" "%%~f" 
)

【讨论】:

  • 是的!有用!非常感谢 :) 就是这么简单,但不知为何我没有想到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多