0

我正在尝试创建一个简单的 .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 语句没有正确打印出来。不过,这可能是先前问题的症状。

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

帕特里克 Q

4

1 回答 1

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%
)

在 ECHO 不带引号的字符时避免出现问题的另一种方法是使用延迟扩展。但是在文件名中有效,如果 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!
)
于 2012-10-27T13:56:37.373 回答