GazClimbs
asked on
Make my dos script loop
Hi, I am using this dos script to reboot a device via ftp. This single instance works fine but I want to use it on multiple devices (all of which have the same credentials). I could just repeat the code for each i.p. address but it would be so much neater to store the i.p. addresses in an array and execute the script for each instance of the array. This is the bit I need help on.....anyone?
@ftp -i -s:"%~f0"&GOTO:EOF
open 192.168.1.7
user
pass
get config/restart
disconnect
ASKER
hey Sara,
Thanks for the help. Im not quit following you. I had saved my original script as a .bat and run that file.
Do I just do the same with this and put the i.p. addresses in ipfile.txt? What format, a different line for each i.p. ?
Gaz
Thanks for the help. Im not quit following you. I had saved my original script as a .bat and run that file.
Do I just do the same with this and put the i.p. addresses in ipfile.txt? What format, a different line for each i.p. ?
Gaz
This script is a wee bit longer than your original, but it still keeps everything in a single file.
Just add your ftp targets to the [FTP_SERVER] section.
The script is currently in test mode and will only display the ftp commands and ftp scripts it would normally run. To run it for real, remove the uppercase ECHO in front of line 23, and replace the uppercase "TYPE" in line 24 with "del".
sarabande,
that approach won't work. The original script is a combined batch/ftp script, where the script calls ftp.exe to run itself. The first line (@ftp ...) is an invalid ftp command and will throw an error (which can be ignored), the rest will be executed by ftp.exe. In other words: ftp.exe processes the script file, so it would try to run "open %1" (literally, not the expanded command line argument) and fail.
For this to work in a loop, the ftp file needs to be dynamically created.
Just add your ftp targets to the [FTP_SERVER] section.
The script is currently in test mode and will only display the ftp commands and ftp scripts it would normally run. To run it for real, remove the uppercase ECHO in front of line 23, and replace the uppercase "TYPE" in line 24 with "del".
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1 delims=[]" %%a in ('type "%~f0" ^| find /n "[FTP_SERVER]"') do set FTPServerStart=%%a
for /f "tokens=1 delims=[]" %%a in ('type "%~f0" ^| find /n "[FTP_SCRIPT]"') do set FTPScriptStart=%%a
for /f "tokens=1 skip=%FTPServerStart%" %%a in ('type "%~f0"') do (
set Line=%%a
if "!Line:~0,1!"=="[" (goto Done) else (call :StartFTP !Line!)
)
:Done
echo Done.
goto :eof
:StartFTP
set FTPServer=%~1
echo [%Time%] Processing %FTPServer% ...
set FTPScript=%Temp%\%~n0.ftp
if exist "%FTPScript%" del "%FTPScript%"
for /f "skip=%FTPScriptStart% delims=" %%a in ('type "%~f0"') do (
call :Expand Line "%%a"
if "!Line:~0,1!"=="[" (goto ScriptEnd) else (>>"%FTPScript%" echo !Line!)
)
:ScriptEnd
ECHO ftp -i -s:"%FTPScript%"
TYPE "%FTPScript%"
goto :eof
:Expand
set %1=%~2
goto :eof
[FTP_SERVER]
1.2.3.4
5.6.7.8
[FTP_SCRIPT]
open %FTPServer%
user
pass
get config/restart
disconnect
sarabande,
that approach won't work. The original script is a combined batch/ftp script, where the script calls ftp.exe to run itself. The first line (@ftp ...) is an invalid ftp command and will throw an error (which can be ignored), the rest will be executed by ftp.exe. In other words: ftp.exe processes the script file, so it would try to run "open %1" (literally, not the expanded command line argument) and fail.
For this to work in a loop, the ftp file needs to be dynamically created.
ASKER
Hey obda, thanks for your input, This works fine, there is however a problem, if one of the devices is not reachable the script falls over and does not execute for the remaining devices on the list.
gaz
gaz
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Very neat obda, thanks for your help
Open in new window
Sara