For循环的问题

时间:2016-12-02 03:19:48

标签: html loops batch-file append

我正在使用for循环,在其中,我回显一个变量,随着循环的继续而更新。对于我的代码格式,我必须每次循环时附加。有没有办法让它第一次覆盖,然后在for循环的其余部分,它会附加?这是我的代码:

    @echo off
    set file=file
    cd %cd%
    SETLOCAL ENABLEDELAYEDEXPANSION
    for /d %%b in (*) do dir /ad /on /s /b "%%b" >> get_dirs.txt
    for /F "tokens=*" %%A in (get_dirs.txt) do ( 
     echo ^<a href="%file%:///%%A"^>%%A^</a^>^<br^> >>index.html
    )
    pause

因此,每次运行此操作时,即使删除输出文件,html文档也会通过复制其中的文本而变得越来越大,所以我有相同的东西,超过100次。 如果你想要一些代码的更多背景故事,请转到开发了一些代码的另一个问题,Command Variable Outputs

1 个答案:

答案 0 :(得分:2)

您可以使用变量来跟踪它是否是第一次迭代,然后在每个分支中使用具有相同命令的IF / ELSE语句,除了一个使用覆盖,另一个追加。但这是不必要的复杂。

最简单的方法是在循环开始之前删除任何现有文件,然后在所有情况下使用append。如果文件尚不存在,附加重定向将自动创建该文件。

@echo off
setlocal
set file=file
del get_dirs.txt
for /d %%b in (*) do dir /ad /on /s /b "%%b" >>get_dirs.txt
del index.html
for /f "delims=" %%A in (get_dirs.txt) do (
  echo ^<a href="%file%:///%%A"^>%%A^</a^>^<br^> >>index.html
)
pause

除非你需要&#34; get_dirs.txt&#34;稍后,我发现没有必要创建该文件。您可以使用FOR / F直接处理DIR命令的结果。

您的代码打开输出文件,将文件指针定位到结尾,并在每次迭代时关闭输出文件一次。这会减慢程序的速度。将括号放在整个FOR语句周围然后使用单个重定向会更有效(更快)。这避免了对追加模式的需要,因此不需要DEL命令。

@echo off
setlocal
set file=file
>index.html (
  for /d %%b in (*) do for /f "delims=" %%A in (
    'dir /ad /on /s /b "%%b"'
  ) do echo ^<a href="%file%:///%%A"^>%%A^</a^>^<br^>
)
pause

以下是一些关于我对您的代码所做的更改的其他注意事项:

  • cd %cd%绝对没有用(将目录更改为当前目录)。所以我删除了那条线。
  • 您启用延迟展开,但从不使用它(您的所有展开都使用%var%代替!var!)。我没有看到任何延迟扩展的需要,并且启用延迟扩展可能会损坏FOR变量(如果它们包含!)。所以我禁用了延迟扩展。
  • 我在定义文件变量之前放置了SETLOCAL。在脚本运行后,将命令会话环境变量空间弄乱是没有意义的。
  • 您对"tokens="的使用可能适用于实际情况。但从技术上讲,这不是你想要的。它将从值中去除前导空格。相反,您希望使用"delims="
  • 禁用delim