如何从字面上回应输出重定向标记(>>)? [英] How to echo output redirection mark (>>) literally?

查看:0
本文介绍了如何从字面上回应输出重定向标记(>>)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个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 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
我在下面的主题中找到了类似的内容: Why gives my script an other output with the echo command?

我不知道如何管理该变量。
提前感谢您的帮助。

推荐答案

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

@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循环中,if条件更改为在达到MAX_FILES的值时退出循环。

首先将输出行赋给用双引号括起来的变量,以将>>解释为字符串,并使用延迟展开并重定向到文件来输出此变量的值。

有关variable=value使用双引号的原因,请同时阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?的答案。

另请参阅Microsoft文章Using command redirection operators

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

@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_COUNT=0导致执行时出现错误消息

该命令的语法不正确。

命令set不支持选项/S,仅支持/A用于算术表达式,/P用于在当前命令进程环境中启用命令扩展时提示用户输入值。

这篇关于如何从字面上回应输出重定向标记(>>)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆