我一直在尝试打印文件名,其中一些包含“!”在他们的名字里。我当前的输出,它打印没有“!”的文件名。
我尝试在循环内启用和禁用延迟扩展,但这似乎会引发一些错误。
错误:“已达到最大 setlocal 递归级别。”
我的批次的片段:
SETLOCAL EnableDelayedExpansion
FOR /f "tokens=*" %%A IN ('dir /B "%covers_dump_full_path%" ^| findstr /V /I /C:".html"') DO (
SET "game_name=%%A"
FOR %%F IN ("%%A") DO SET "game_name_no_ext=%%~NF"
if !current_column! == 1 (
ECHO ^<tr^>>> "%game_html%"
)
REM -------- THIS IS THE LINE THAT IS CAUSING ME ISSUES --------
ECHO ^<td align="center"^> ^<img src="!game_name!" width=300 height=250^> ^<br^> ^<b^> !game_name_no_ext! ^<br^> ^</b^> ^</td^>>> "%game_html%"
if !current_column! == !max_columns! (
ECHO ^</tr^>>> "%game_html%"
SET /a current_column=0
)
SET /a current_column=!current_column!+1
)
那么,即使文件名带有“!”,我怎样才能打印它们呢?在他们的名字里?
我想到了使用混合脚本与 VBScript 来解决这个问题。但我试图将其作为一个完整的纯 CMD 批处理脚本。我不想重写我的批处理以包含 VBScript,除非没有任何解决方案。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following setting for the directory is a name
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET /a current_column=1
SET /a max_columns=3
SET "game_html=u:\g.txt"
(
FOR /f "tokens=*" %%E IN ('dir /B /a-d "%sourcedir%" ^| findstr /V /I /C:".html"') DO (
if !current_column! == 1 (
ECHO ^<tr^>
)
SETLOCAL DISABLEDELAYEDEXPANSION
REM -------- THIS IS THE LINE THAT IS CAUSING ME ISSUES --------
ECHO ^<td align="center"^> ^<img src="%%E" width=300 height=250^> ^<br^> ^<b^> %%~nE ^<br^> ^</b^> ^</td^>
ENDLOCAL
if !current_column! == %max_columns% (
ECHO ^</tr^>
SET /a current_column=0
)
SET /a current_column+=1
)
ECHO ^</tr^>
)>> "%game_html%"
GOTO :EOF
在应用于真实数据之前,始终验证测试目录。
稍微重写一下。
出于有争议但对我来说有意义的原因,我已将
metavariable
从 %%F
更改为 %%E
。
在
/a-d
命令中添加了dir
以排除与掩码匹配的目录名称;面罩以适合我的机器。
包括
setlocal/endlocal
以暂时禁用延迟扩展。
使用
%%E
和%%~nE
代替变量,因此不再需要建立这些。
max_column
在循环内不会改变,所以使用%var%
。使用此约定会大喊“危险,威尔·罗宾逊!”关于在循环中做更改的变量,但对那些不更改的变量保持沉默。
对 current_column
使用较短的增量方法(请参阅文档提示中的
set /?
)在整个
(..)>>filename
周围添加了
for
,它累积了
echo
ed 项目并将它们附加到文件中,因此添加了所需的终端
</tr>