如何从字面上回显输出重定向标记(>>)?

时间:2016-12-15 09:11:41

标签: batch-file echo

我正在创建一个bat文件,它会写一个将被另一个bat调用的脚本。

我写的:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="form-group">
    <label for="brutto">Brutto</label>
    <input class="form-control" readonly="readonly" name="brutto" type="text" id="brutto">
</div>
<div class="form-group">
    <label for="tax">Taxes 19%</label>
    <input class="form-control" readonly="readonly" name="tax" type="text" id="tax">
</div>
<div class="form-group">
    <label for="netto">Netto</label>
    <input class="form-control" name="netto" type="text" id="netto">
</div>

我的问题出在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

我在这里找到了类似的主题: Why gives my script an other output with the echo command?

我不知道如何管理变量 在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

(实施例)

    echo echo %%a^>^>C:\Downloaded_Files.txt>>myscript-NTRE_TN_F

插入符号^表示字面上会再现以下字符。

答案 1 :(得分:1)

我建议使用这个批处理代码:

@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的值时退出循环。

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

请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案,了解为何在variable=value附近使用双引号的原因。

另请参阅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用于提示用户输入值,如果启用了命令扩展名在当前的命令处理环境中。