Batch file 如何逐字回显输出重定向标记(>;>;)?

Batch file 如何逐字回显输出重定向标记(>;>;)?,batch-file,echo,Batch File,Echo,我正在创建一个bat文件,该文件将为我编写一个脚本,该脚本将由另一个bat调用 我写的是: echo @echo off>>myscript-NTRE_TN_F echo open 127.0.0.1>>myscript-NTRE_TN_F echo user USER PASS>>myscript-NTRE_TN_F echo prompt n>>myscript-NTRE_TN_F echo ascii>>myscript-NTRE

我正在创建一个bat文件,该文件将为我编写一个脚本,该脚本将由另一个bat调用

我写的是:

echo @echo off>>myscript-NTRE_TN_F
echo open 127.0.0.1>>myscript-NTRE_TN_F
echo user USER PASS>>myscript-NTRE_TN_F
echo prompt n>>myscript-NTRE_TN_F
echo ascii>>myscript-NTRE_TN_F
echo lcd C:\>>myscript-NTRE_TN_F

SET MAX_FILES=200
SET /S FILE_COUNT=0

for /F "usebackq tokens=1,2 delims=," %%a IN ("C:\filelist-NTRE_TN_F.txt") DO (
    IF !FILE_COUNT! LSS %MAX_FILES% (
        echo mget %%a>>myscript-NTRE_TN_F
        echo echo %%a>>C:\Downloaded_Files.txt>>myscript-NTRE_TN_F
    )
    SET /A FILE_COUNT+=1
)

echo bye>>myscript-NTRE_TN_F
我的问题在
echo%%a
部分。
我现在的输出是:

@echo off
open 127.0.0.1
user USER PASS
prompt n
ascii
lcd C:\
mget FILE1
echo FILE1
mget FILE2
echo FILE2
bye
我想要这样的输出:

@echo off
open 127.0.0.1
user USER PASS
prompt n
ascii
lcd C:\
mget FILE1
echo FILE1>>C:\Downloaded_Files.txt"
mget FILE2
echo FILE2>>C:\Downloaded_Files.txt
bye
我在这里的主题中发现了类似的东西:

我不知道如何管理变量。

提前感谢您的帮助。

我建议使用此批处理代码:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "ScriptFile=myscript-NTRE_TN_F"
>"%ScriptFile%" echo @echo off
>>"%ScriptFile%" echo open 127.0.0.1
>>"%ScriptFile%" echo user USER PASS
>>"%ScriptFile%" echo prompt n
>>"%ScriptFile%" echo ascii
>>"%ScriptFile%" echo lcd C:\

SET "MAX_FILES=200"
SET "FILE_COUNT=0"

for /F "usebackq tokens=1,2 delims=," %%a IN ("C:\filelist-NTRE_TN_F.txt") DO (
    IF !FILE_COUNT! GEQ %MAX_FILES% goto Finish
    >>"%ScriptFile%" echo mget %%a
    set "ScriptLine=>>C:\Downloaded_Files.txt echo %%a"
    >>"%ScriptFile%" echo !ScriptLine!
    SET /A FILE_COUNT+=1
)

:Finish
>>"%ScriptFile%" echo bye
endlocal
重定向操作符也可以放在一行的开头,这样更容易读取写入文件的内容

FOR循环中,如果条件更改为在达到
MAX_FILES
的值时退出循环,则

要输出的行首先分配给一个用双引号括起来的变量,以将
>
解释为字符串,并使用延迟扩展和重定向到文件来输出该变量的值

另请阅读上的答案,了解为什么在
variable=value
周围使用双引号的解释

另请参见Microsoft文章

另一个更好的解决方案是:

@echo on
setlocal EnableExtensions EnableDelayedExpansion
set "ScriptFile=myscript-NTRE_TN_F"
(
    echo @echo off
    echo open 127.0.0.1
    echo user USER PASS
    echo prompt n
    echo ascii
    echo lcd C:\
)>"%ScriptFile%"

SET "MAX_FILES=200"
SET "FILE_COUNT=0"

for /F "usebackq tokens=1,2 delims=," %%a IN ("C:\filelist-NTRE_TN_F.txt") DO (
    IF !FILE_COUNT! GEQ %MAX_FILES% goto Finish
    echo mget %%a
    set "ScriptLine=>>C:\Downloaded_Files.txt echo %%a"
    echo !ScriptLine!
    SET /A FILE_COUNT+=1
)>>"%ScriptFile%"

:Finish
echo bye>>"%ScriptFile%"
endlocal
两个命令块中输出到STDOUT的所有行被重定向到脚本文件中以创建

顺便说一句:
SET/S FILE\u COUNT=0
执行时出现错误消息

该命令的语法不正确

命令SET不支持选项
/S
,只支持算术表达式的
/A
,以及在当前命令处理环境中启用命令扩展时提示用户输入值的
/p

(示例)


插入符号
^
表示可以按字面意思复制以下字符。

为什么要将命令提示符命令
@echo off
写入FTP脚本?是的,你完全正确。。。这就是我现在发现的尝试脚本。。。我必须了解如何做到这一点,因为我需要在一个文件中写入跟踪我已经下载的文件。顺便说一下,谢谢你的评论!我想我明白了。为了提供信息,我更改了echo并将其放在“myscript”之外:echo%%a>>C:\Downloaded_Files.txt SET/a FILE_COUNT+=1非常感谢您的评论。我不知道如何使用“^”字符!谢谢你的建议,特别是你教我(新手)如何和为什么用这种方式编码。我正在使用这个建议,所以我接受你的答案!我只是修改了两行以排除FTP脚本中的echo,因为我不需要它。再次感谢大家!!!干杯
    echo echo %%a^>^>C:\Downloaded_Files.txt>>myscript-NTRE_TN_F