如何在 CMD 中使用延迟扩展和循环时从变量动态打印感叹号?

问题描述 投票:0回答:1

我一直在尝试打印文件名,其中一些包含“!”在他们的名字里。我当前的输出,它打印没有“!”的文件名。

我尝试在循环内启用和禁用延迟扩展,但这似乎会引发一些错误。

错误:“已达到最大 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,除非没有任何解决方案。

windows batch-file cmd command-prompt
1个回答
0
投票
@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>

    

© www.soinside.com 2019 - 2024. All rights reserved.