2012-10-27 19 views
0

我试图创建一个简单的.bat文件,将生成包含图像链接到当前目录中的所有图像的.html文件。如何使用.BAT创建本地html的图片库

用法: C:>画廊

输出: gallery.html

文件内容:

<HTML><HEAD></HEAD><BODY> 
<IMG SRC="C:/path/path/path/image1.gif"> 
<IMG SRC="C:/path/path/path/randomepic.gif"> 
<IMG SRC="C:/path/path/path/asdfsadfasd.gif"> 
</BODY></HTML> 

注的图像文件会产生不可预料的名称,但将永远为.gif 。

我有什么(在gallery.bat)

@echo off 
    set file_start=<HTML><HEAD></HEAD><BODY> 
    set image_start=<IMG SRC=" 
    set image_dir=`cd` 
    set image_end="> 
    set file_end=</BODY></HTML> 
    set file_name=gallery.html 

    echo %file_start% > %file_name% 
    for %%image in (*.gif) do @echo %image_start%%image_dir%%%image%image_end% >> $file_name% 
    echo %file_end% >> %file_name% 

但它不工作。我无法得到出现的小于符号,因为批处理文件认为它是输入重定向。如果我用<符号引用这些行,那么引号出现在echo语句中。

而且,我不能让cd命令的输出保存到变量%image_dir%

最后,在for循环中的echo语句不打印出正确。这可能是以前问题的一个症状。

我希望它只是我有一些小的语法问题。有谁知道如何解决这一问题?谢谢你的时间!

Patrick Q

+2

可能有一种方法可以在批处理文件中完全做到这一点,但我会使用外部实用程序,它可以在文件中执行搜索+替换。然后,您可以使用模板HTML文件,并在批处理文件中替换占位符 –

+0

感谢Pekka,但这对我的使用案例来说太过分了。 –

回答

5

FOR变量必须是单个字符。你不能使用类似%%image的东西。

您有<>两次以上的问题。一旦你定义你的变量,并再次回显扩展变量时。这些字符必须用^引用或转义。

您可以分配过程中使用引号,而不包括在可变报价 -
set "var=value"。由于嵌入式报价,image_end的分配有点棘手。

你可以在你的初始分配逃避问题的字符避免与ECHO的问题。

不能使用CD来获取当前目录。正确的语法是%CD%。但你不需要你的image_dir变量。您可以使用~f修饰符来获取文件名的完整路径。从命令提示符输入help for以获取有关FOR变量修饰符的更多信息。

更有效地附上所有生产括号输出,并重定向到输出文件只有一次的命令。

@echo off 
setlocal 
set "file_start=^<HTML^>^<HEAD^>^</HEAD^>^<BODY^>" 
set "image_start=^<IMG SRC="" 
set ^"image_end="^>" 
set "file_end=^</BODY^>^</HTML^>" 
set "file_name=gallery.html" 

>"%file_name%" (
    echo %file_start% 
    for %%I in (*.gif) do echo %image_start%%%~fI%image_end% 
    echo %file_end% 
) 

避免问题的另一种方法是避免使用未加引号的字符来使用延迟扩展。但!在文件名中是有效的,如果延迟扩展包含!字符,将会破坏FOR变量的扩展。所以延迟扩展必须在循环内开启和关闭。

@echo off 
setlocal enableDelayedExpansion 
set "file_start=<HTML><HEAD></HEAD><BODY>" 
set "image_start=<IMG SRC="" 
set ^"image_end=">" 
set "file_end=</BODY></HTML>" 
set "file_name=gallery.html" 

>"%file_name%" (
    echo !file_start! 
    setlocal disableDelayedExpansion 
    for %%I in (*.gif) do (
    set "image=%%~fI" 
    setlocal enableDelayedExpansion 
    echo !image_start!!image!!image_end! 
    endlocal 
) 
    endlocal 
    echo !file_end! 
) 
+0

完美!感谢您解释所有的错误!这里有很多很棒的信息。你提供的代码就像CHAMP一样工作! –

+0

我有一个后续问题。有没有办法让文件列表下降到子目录中? –

+0

@ user1706790 - 当然,只需使用'for/r %% i ...'。没有别的东西需要改变。 '%%〜i'将会有完整的路径,所以'〜f'修饰符不再需要,尽管它没有任何伤害。 – dbenham