Estoy creando un archivo bat que me escribirá un script que será llamado por otro bat.

Lo que escribí:

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

Mi problema está en la parte echo echo %%a.
Mi salida ahora es:

@echo off
open 127.0.0.1
user USER PASS
prompt n
ascii
lcd C:\
mget FILE1
echo FILE1
mget FILE2
echo FILE2
bye

Me gustaría una SALIDA como esta:

@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

Encontré algo similar en el tema aquí: ¿Por qué le da a mi script otra salida con el eco? comando?

No sé cómo administrar la variable.
Gracias de antemano por tu ayuda.

1
MarcaSolkanar 15 dic. 2016 a las 12:11

2 respuestas

La mejor respuesta

Sugiero usar este código de lote:

@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

El operador de redirección también se puede colocar al principio de una línea, lo que facilita la lectura de lo que está escrito en el archivo.

Dentro del ciclo FOR , la condición IF se cambia para salir del ciclo al alcanzar el valor de MAX_FILES.

Y la línea de salida se asigna primero a una variable encerrada entre comillas dobles para que >> se interprete como una cadena y el valor de esta variable se genera mediante expansión retardada con redirección al archivo.

Lea también la respuesta en ¿Por qué no aparece una cadena de salida con 'echo% var%' después de usar 'set var = text' en la línea de comando? < / a> para una explicación de por qué usar comillas dobles alrededor de variable=value.

Consulte también el artículo de Microsoft Uso de operadores de redirección de comandos

Otra solución aún mejor es:

@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

Todas las líneas de salida a STDOUT dentro de los dos bloques de comando se redirigen al archivo de secuencia de comandos para crear.

Por cierto: SET /S FILE_COUNT=0 resultó en la ejecución en un mensaje de error

La sintaxis del comando es incorrecta.

El comando SET no admite una opción /S, solo /A para una expresión aritmética y /P para solicitar al usuario un valor si las extensiones de comando están habilitadas en el comando actual entorno de proceso.

1
Community 23 may. 2017 a las 10:30

(ejemplo)

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

El signo de intercalación ^ significa que el siguiente carácter se reproducirá literalmente.

2
Magoo 15 dic. 2016 a las 10:30