我正在使用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。
答案 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变量(如果它们包含!
)。所以我禁用了延迟扩展。"tokens="
的使用可能适用于实际情况。但从技术上讲,这不是你想要的。它将从值中去除前导空格。相反,您希望使用"delims="
。