Chimaera
Hi
Im messing with this atm that i found on the net
Code: Select all
@echo off
echo.
echo.
setlocal
set COUNT=0
set MAXCOUNT=1000
set SECONDS=1
:LOOP
title "\\"
call :WAIT
title "||"
call :WAIT
title "//"
call :WAIT
title "--"
call :WAIT
if /i "%COUNT%" equ "%MAXCOUNT%" goto :EXIT
set /a count+=1
echo %COUNT%
goto :LOOP
:WAIT
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
goto :EOF
:EXIT
title FIN!
endlocal
the above code does a count but its down the page i want it one one line across the page, the twirly bit in the header of the batch really isnt that important
But i want the count to increase relative to the job its doing so it would need to assess how big the job is and tailor itself accordingly
The robo command i use would be like this
but on different machines the data size would be different so the start and finish values would be different in size so it has to reach 100% for eg when the file finishes.ROBOCOPY %_backup_source% %_backup_dest% %_back_what% %_robo_vista_1%
i wonder if tasklist was the way to go but i couldnt work out what the filters did for window title eg
assuming thats the right way to use it, but can it read the window its called from? and give me the progress indicator i need?tasklist Windowtitle eq, ne mywindow name
it would be nice to just have a line in the batch that increase as the batch progresses
so
* to ** to *** etc etc
or can i do
and have some way of swopping down the list as the file progressesset _indicator1=*
set _indicator1=**
set _indicator1=***
set _indicator1=****
set _indicator1=*****
anyway back to looking for an answer
thanks for any pointers
Last edited by Chimaera (19 Jan 2010 09:23)
Offline
----------------------------
#19 Jan 2010 20:08
Chimaera
Ok i came up with this its a bit rough but seems to work
Code: Select all
@echo off
setlocal
set COUNT=0
set MAXCOUNT=1
set SECONDS=2
set _indicator1=*
set _indicator2=**
set _indicator3=***
set _indicator4=****
set _indicator5=*****
set _indicator6=******
set _indicator7=*******
set _indicator8=********
set _indicator9=*********
set _indicator10=**********
set _indicator11=***********
set _indicator12=************
set _indicator13=*************
set _indicator14=**************
set _indicator15=***************
:start
echo.
echo.
echo %_indicator1%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator2%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator3%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator4%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator5%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator6%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator7%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator8%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator9%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator10%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator11%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator12%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator13%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator14%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
echo.
echo.
echo %_indicator15%
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
CLS
if /i "%COUNT%" equ "%MAXCOUNT%" goto :stop
set /a count+=1
goto :start
:stop
----------------------------
#20 Jan 2010 00:00
Drewfus
Maybe this will help...
How To Show a Progress Bar While Copying Files? [dead link]
----------------------------
#20 Jan 2010 00:42
bluesxman
The concept intrigued me, so I came up with the following script. I've not tested it thoroughly and I'm sure it could be optimised in a couple of places, but it seems to work for me.
:: Notes ::
Works based on the number of files to be copied, rather than the space they occupy.
Should also detect if the robocopy process has ended while there are still files to copy.
Calculates progress by repeatedly comparing source to target, so if new files are appearing at source during the copy the bar might backstep; it will also falsely report an abort when the robocopy process exits.
Accuracy suffers a little due to the rounding by the "set /a" command (but not be enough to worry about).
Code: Select all
@echo off
set "source=e:\test\source"
set "target=e:\test\target"
set "rc=robocopy.exe"
set "rc.command=%rc% "%source%." "%target%." /s"
set "bar.width=20"
set "bar.char=*"
set "bar.backchar= "
set "bar.size=0"
set "bar.back="
set "bar.del="
set "bar.position=0"
set "loop.delay=5"
set "done=0"
set "total=1"
set "abort="
set "window.title=%rc%_%date%_%time: =0%"
echo:START
REM spawn the robocopy command with a (hopefully) unique window title that we'll need later
start /min "%window.title%" %rc.command%
REM draw the empty bar
for /l %%a in (1,1,%bar.width%) do (call set "bar.back=%%bar.back%%%bar.backchar%")
call set "bar.del=%%bar.back:%bar.backchar%=%%"
set /p "out=[%bar.back%]%bar.del%" <nul
set /a loop.delay+=1
title Please stand by...
call :loop
echo:
if defined abort (echo:ABORT) ELSE (echo:END)
pause
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::
set bar=
REM if all the files have been copied, draw a full bar (in case it didn't get filled
REM on the previous iteration) and exit
if %done% GEQ %total% (
for /l %%a in (1,1,%bar.width%) do call set "bar=%bar.char%%%bar%%"
call set /p "out=%%bar%%" <nul
set abort=
goto :EOF
)
REM if the robocopy child process wasn't running on the previous iteration and there
REM are still files left uncopied then we assume that robocopy died unexpectedly
if defined abort goto :EOF
REM check for the robocopy child process (using out "unique" window title)
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | findstr "." >nul
REM if it's not found, set a flag (it'll be dealt with on the next interation)
if errorlevel 1 set abort=1 & set loop.delay=1
REM run a duplicate robocopy process with the "/L" switch to so we can extract
REM the total number of files and those that have been copied from the output
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a total=%%a,remain=%%b,done=%%c
)
REM figure out (roughly) how many files need to be copied to increase the progress
REM bar by one step
set /a bar.step=total / bar.width
REM in case it rounds down to zero...
if %bar.step% EQU 0 set bar.step=1
REM calculate the position using the number of copied files and the step value
set /a bar.position=(done / bar.step)
REM if for some reason the position is greater than the width, fix it
REM (this would occur if the number of files is not much more than
REM the defined bar width)
if %bar.position% GTR %bar.width% set /a bar.position=bar.width
REM draw the bar (we're redrawing the whole thing on each interation)
for /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar%%"
set /p "out=%bar%" <nul
title %done% / %total%
REM delay before interating so that the script doesn't thrash the system
ping 127.1 -n %loop.delay% -w 1000 >nul
goto :loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::
cmd | *sh | ruby | chef
----------------------------
#20 Jan 2010 15:34
Chimaera
Been trying to get this to work
set "rc=robocopy.exe" << what is this one for plz, is it just for shortnameing the file? or is it like this because you call it with a child
set "rc.command=%rc% "%source%." "%target%." /s" << ive been trying to add my origanal command to here
eg ROBOCOPY %source% %target% %_back_what% %_robo_vista_1% mainly the last bit as i have parameters and exemptions that i need
eg: SET _robo_vista_1=/COPY:DAT /S /B /XJD /XJF /R:0 /W:0 /XA:SH /NJH /NJS /XF %_exc_vista_files% %_exc_prog_files% /XD %target% %_exc_vista_folder% %_exc_prog_folder% %_exc_special_folder%
set "window.title=%rc%_%date%_%time: =0%" <<<this is just for the child window title yes?
With a bit of messing on win7 ive managed to get the windows active but the robocopy window ignores all my exemptions and attributes completely so i guess the set "rc.command=%rc% line isnt working right with my params i even tried adding the /COPY:DAT /S /B /XJ etc etc line instead of the /s part but it ignored that as well.
and the main window with the
START
[ ]
just stays like that with the cursor flashing near it
with this
"%target%." why does it have a full stop at the end of it?, is it needed elsewhere in the file?
Im asuming this will only work with the process in a child window ?
thanks for taking a look
Last edited by Chimaera (20 Jan 2010 15:40)
----------------------------
#20 Jan 2010 16:17
bluesxman
Yes.Member
Been trying to get this to work
set "rc=robocopy.exe" << what is this one for plz, is it just for shortnameing the file?
Try this:set "rc.command=%rc% "%source%." "%target%." /s" << ive been trying to add my origanal command to here
eg ROBOCOPY %source% %target% %_back_what% %_robo_vista_1% mainly the last bit as i have parameters and exemptions that i need
eg: SET _robo_vista_1=/COPY:DAT /S /B /XJD /XJF /R:0 /W:0 /XA:SH /NJH /NJS /XF %_exc_vista_files% %_exc_prog_files% /XD %target% %_exc_vista_folder% %_exc_prog_folder% %_exc_special_folder%
Code: Select all
SET _robo_vista_1=/COPY:DAT /S /B /XJD /XJF /R:0 /W:0 /XA:SH /NJH /XF %_exc_vista_files% %_exc_prog_files% /XD %target% %_exc_vista_folder% %_exc_prog_folder% %_exc_special_folder%
set "rc.command=%rc% "%source%." "%target%." "%_back_what%" %_robo_vista_1%"
Yes, so that we can detect if the child process has exited prematurely.set "window.title=%rc%_%date%_%time: =0%" <<<this is just for the child window title yes?
"%target%." why does it have a full stop at the end of it?
See here.
Correct. CMD doesn't lend itself well to having background processes running in the same window, and "robocopy" must be a background process for the effect you're seeking.Im asuming this will only work with the process in a child window ?
Last edited by bluesxman (20 Jan 2010 16:21)
cmd | *sh | ruby | chef
----------------------------
#20 Jan 2010 21:45
Chimaera
Ok now we are getting somewhere
couple of unusual things that occured i thought i would mention
The administrator window {parent} got to 1 short of the end like this
START
[******************* ]
and on the title it says 4441 / 4474 so 33 short and it stayed open, the child closed at the end of the robo run.
should it have finished completly? , i remember you mentioned the accuracy
and for some odd reason i got two copys of the backup, one which i couldnt open which gave drive unavailable errors and the other one worked as normal.
I guess the only one i need is the normal one but which is which who knows lol
Weird the odd one i cant delete off the desktop, ill have to try safe mode
i understand better about the full stop now, so really i should add the full stop to all my %????% params y?
outstanding bit of work m8 :clap:
Last edited by Chimaera (20 Jan 2010 21:53)
----------------------------
#21 Jan 2010 01:06
bluesxman
I'm going to guess that this is due to files appearing at the source location (see the "notes" section in my original post.)and on the title it says 4441 / 4474 so 33 short and it stayed open, the child closed at the end of the robo run.
should it have finished completly? , i remember you mentioned the accuracy
Here's a mod that might help (two areas of code to hack):
Code: Select all
set "done=0"
set "total=1"
set "get.total=1"
set "abort="
Code: Select all
REM run a duplicate robocopy process with the "/L" switch to so we can extract
REM the total number of files and those that have been copied from the output
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
if defined get.total (set /a total=%%a&set get.total=)
set /a remain=%%b,done=%%c
)
I guess the only one i need is the normal one but which is which who knows lol
Weird the odd one i cant delete off the desktop, ill have to try safe mode
Don't know what to tell you on that one.
For source and target, yeah.so really i should add the full stop to all my %????% params
cmd | *sh | ruby | chef
----------------------------
#21 Jan 2010 21:24
bluesxman
I've make a few tweaks:
Now defaults to filling the screen width with the bar (but you can override if you want to).
If there aren't very many files, it will now fill the bar by a more appropriate amount (rather than 1 blob per file)
If 2 blobs per file is too many (bar would fill too early), and 1 blob is too few (bar wouldn't fill fast enough) it'll override the calculated (or forced) bar width to match the number of files, so that 1 blob per file is correct.
I've reworked it slightly so that the total number of files is only calculated once (same idea as the mods I posted earlier, but renders them irrelevant).
Changed the characters used to draw the bar, for no good reason other than aesthetics.
Should behave if there aren't actually any files to copy.
Code: Select all
@echo off
set "source=e:\test\source"
set "target=e:\test\target"
set "rc=robocopy.exe"
set "rc.command=%rc% "%source%." "%target%." /s"
REM make the bar as wide as possible
for /f "usebackq tokens=2" %%a in (`mode con ^| find "Columns:"`) do set /a bar.width=%%a - 3
REM or you can force the width on the next line (no sanity checking is done on this value)
REM set "bar.width=40"
set "bar.char=þ"
set "bar.backchar=ú"
set "bar.size=0"
set "bar.back="
set "bar.del="
set "bar.position=0"
set "bar.position.modifier=0"
set "bar.check=0"
set "loop.delay=3"
set "done=0"
set "total=-1"
set "abort="
set "window.title=%rc%_%date%_%time: =0%"
echo:START
REM spawn the robocopy command with a (hopefully) unique window title that we'll need later
start /min "%window.title%" %rc.command%
REM find the total number of files, so we can shrink the bar to fit the total, if necessary
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "total=%%a,done=%%c"
)
set /a "bar.check=bar.width / total" 2>nul
if %bar.check% EQU 1 set /a bar.width=total
REM draw the empty bar
for /l %%a in (1,1,%bar.width%) do (call set "bar.back=%%bar.back%%%bar.backchar%")
call set "bar.del=%%bar.back:%bar.backchar%=%%"
set /p "out=[%bar.back%]%bar.del%" <nul
set /a loop.delay+=1
title Please stand by...
call :loop
echo:
if defined abort (echo:ABORT) ELSE (echo:END)
pause
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::
set bar=
REM if all the files have been copied, draw a full bar (in case it didn't get filled
REM on the previous iteration) and exit
if %done% GEQ %total% (
title %done% / %total%
for /l %%a in (1,1,%bar.width%) do call set "bar=%bar.char%%%bar%%"
call set /p "out=%%bar%%" <nul
set abort=
goto :EOF
)
REM if the robocopy child process wasn't running on the previous iteration and there
REM are still files left uncopied then we assume that robocopy died unexpectedly
if defined abort goto :EOF
REM check for the robocopy child process (using out "unique" window title)
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | findstr "." >nul
REM if it's not found, set a flag (it'll be dealt with on the next interation)
if errorlevel 1 set abort=1 & set loop.delay=1
REM run a duplicate robocopy process with the "/L" switch to so we can extract
REM the total number of files and those that have been copied from the output
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "remain=%%b,done=%%c"
)
REM figure out (roughly) how many files need to be copied to increase the progress
REM bar by one step
set /a bar.step=(total / bar.width) - 1
REM in case its less than one...
if %bar.step% LEQ 0 set bar.step=1
REM calculate the bar modifier, which takes effect if the total number of files
REM is significantly lower than the bar width.
set /a bar.position.modifier=bar.width / total
if %bar.position.modifier% LEQ 0 set /a bar.position.modifier=1
REM calculate the position using the number of copied files and the step value
set /a bar.position=(done / bar.step) * bar.position.modifier
REM if for some reason the position is greater than the width, fix it
REM (this would occur if the number of files is not much more than
REM the defined bar width)
if %bar.position% GTR %bar.width% set /a bar.position=bar.width
REM draw the bar (we're redrawing the whole thing on each interation)
for /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar%%"
set /p "out=%bar%" <nul
title %done% / %total%
REM delay before interating so that the script doesn't thrash the system
ping 127.1 -n %loop.delay% -w 1000 >nul
goto :loop
Last edited by bluesxman (21 Jan 2010 23:04)
cmd | *sh | ruby | chef
----------------------------
#22 Jan 2010 00:17
Chimaera
Ive worked out what the folder appears from it first appears when you try and delete the file after the test
"Test" becomes "Test." for some strange reason and its like the folder dosent exist like an echo after deleting and it takes a lot of messing about to get rid off it, now i dont know if this is a windows 7 issue or not?
ill try the new batch in a bit when i get time and let you know what happens
usually at the end of the batch i run
problem is where do i put this on the batch so its the last thing before closing the file so it does the robocopy the sets the attribs so all the files are workable as their is hidden and all sorts of stuff involved.ATTRIB /S /D -r -a -s -h "%target%."
ATTRIB /S /D -r -a -s -h "%target%.\*.*"
Does it need to be in the loop section or somewhere else?
Edit
just ran the file and i get this
START
Managed to capture a bit of the output[Divide by zero error.························································]
Divide by zero error.
Divide by zero error.
Divide by zero error.
Divide by zero error.
Divide by zero error.
Divide by zero error.
Divide by zero error.
Divide by zero error.
Divide by zero error.
Last edited by Chimaera (11 Feb 2010 19:52)
----------------------------
#22 Jan 2010 12:12
bluesxman
Did you read my last two posts?!
EDIT: Sorry, I think you might have caught a version that had a bug in it -- I edited the tweaked script posted later on yesterday evening. Please have another go with the version that's there now.
Last edited by bluesxman (22 Jan 2010 15:45)
cmd | *sh | ruby | chef
----------------------------
#22 Jan 2010 19:40
Chimaera
Not quite sure whats happening now, i see this straight away and the title of the parent window reads
Administrator : 0 / -1
no matter what the child window is doing
The child window seems to be running as normalSTART
[■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■]
END
Press any key to continue . . .
any thoughts
Last edited by Chimaera (22 Jan 2010 19:40)
----------------------------
#22 Jan 2010 20:05
bluesxman
Yes, I'll wager you are still including /NJS in your robocopy command. See comments regarding this in post #6.
cmd | *sh | ruby | chef
----------------------------
#23 Jan 2010 00:00
Chimaera
As always ur the man lol
with the messing about copying bits from my script to yours i had copied the /NJS again thx again
now this time
Title gets to 2689 / 2714
and the bar look pretty much full
Code: Select all
START
[■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■]
so im guessing it never gets to this statement somehow
i tried my attrib section above and below the loop section but it dosent perform it so the files are still hidden possible because the END dosent happenif defined abort (echo:ABORT) ELSE (echo:END)
Last edited by Chimaera (23 Jan 2010 00:11)goto :loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:attrib
::
ATTRIB /S /D -r -a -s -h %target%
ATTRIB /S /D -r -a -s -h %target%\*.*
----------------------------
#23 Jan 2010 16:09
bluesxman
I've tested it with various numbers of files (0, 1, 5, 40, 70, 2000 and 33,000) and it seems to work fine (though this was static test data).
Perhaps files at the source location are changing or are locked for reading by some other process and that is causing a discrepancy so that the value for %total% never gets reached. Given that it looks like you're trying to copy the whole of C: (with some exceptions) I'm not particularly surprised about this.
However, it should at least "ABORT" once it detects that the child process has disappeared.
Does the child process actually close when it's done?
What happens if you close the child process manually, part way through the copy?
Speculating that the tasklist command under Vista/Win7 behaves in a different manner to WinXP, perhaps this hack will make a difference:
Code: Select all
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | find /i "robocopy.exe" >nul
Code: Select all
if defined abort (echo:ABORT) ELSE (echo:END)
ATTRIB /S /D -r -a -s -h %target%
ATTRIB /S /D -r -a -s -h %target%\*.*
pause
goto :EOF
Last edited by bluesxman (23 Jan 2010 16:21)
cmd | *sh | ruby | chef
----------------------------
#23 Jan 2010 20:34
Chimaera
That seems to have done the job m8
It stopped with a Abort
2703 / 2710
i guess the missing files are the running windows processes, even though robocopy discounts them, it still counts them causing the variable
Code: Select all
START
[■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■]
ABORT
Press any key to continue . . .
Thanks for joining in and helping out m8
Last edited by Chimaera (23 Jan 2010 20:37)
----------------------------
#22 Mar 2010 09:00
Chimaera
Finally got round to doing some work with this and got a fair way but i have run into a few questions
Problem appears to be im running 3 versions of this one under another
for eg:
Main Backup
Outlook Backup
Firefox Backup
but the first section works properly and follows the exemptions as it supposed to, but the second 2 section just ignore the presets that i have set for it/
i have tried moving stuff around just in case it needs it later in the file for eg and ive tried diff permutations.
i start each section with the robo line so it dosent confuse the others for eg
SET "rc.command=%rc% "%source%." "%target%." "%_back_what%" %_robo_vista_1%"
rest of stuff to
goto :loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::
SET "rc.command=%rc% "%source%." "%target%." "%_back_outlook%" %_robo_outlook_1%"
and same again for the last one.
I wondered if its remembering some of the previous settings from doing the loops before and its confusing it
the progress line shows each time and the robocopy window is there its just not picking up files
is there a way of clearing settings out of memory so i can test?
----------------------------
#24 Mar 2010 08:17
bluesxman
Can't easily troubleshoot a script I can't see. Can you post it? Just the script -- don't need to see the output at this time.
cmd | *sh | ruby | chef
----------------------------
#24 Mar 2010 08:55
Chimaera
Ive bolded the stuff ive changed and the first one uses
and the second usesset _back_what=*.*
SET _back_outlook=*.pst *.email *.wab *.imapmbox *.sdm *.sig *.dbx *.eml *.maildb *.mailhost *.boe *.box *.dic *.emlx *.mai *.mbg *.mbox *.mbs *.mbx *.toc *.fol nndbase.* *.msf *.msg *.nws *.oab *.obi *.oft *.ost *.pab *.pmi *.pmm *.vfb *.iaf *.nk2
::
Code: Select all
:_vista_start
::
SET "rc.command=%rc% "%source%." "%target%." "%_back_what%" %_robo_vista_1%"
echo Starting Main Backup ...... Please Wait
::
for /f "usebackq tokens=2" %%a in (`mode con ^| find "Columns:"`) do set /a bar.width=%%a - 3
::
REM set "bar.width=40"
set "bar.char=þ"
set "bar.backchar=ú"
set "bar.size=0"
set "bar.back="
set "bar.del="
set "bar.position=0"
set "bar.position.modifier=0"
set "bar.check=0"
set "loop.delay=3"
set "done=0"
set "total=-1"
set "abort="
::
set "window.title=%rc%_%date%_%time: =0%"
::
echo:START
echo.
start /min "%window.title%" %rc.command%
::
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "total=%%a,done=%%c"
)
::
set /a "bar.check=bar.width / total" 2>nul
::
if %bar.check% EQU 1 set /a bar.width=total
::
for /l %%a in (1,1,%bar.width%) do (call set "bar.back=%%bar.back%%%bar.backchar%")
call set "bar.del=%%bar.back:%bar.backchar%=%%"
set /p "out=[%bar.back%]%bar.del%" <nul
::
set /a loop.delay+=1
::
title Please stand by...
::
call :loop
::
echo:
echo.
::
if defined abort (echo:ABORT) ELSE (echo:END)
::
goto :vista_outlook
::
pause
::
:loop
::
set bar=
::
if %done% GEQ %total% (
title %done% / %total%
for /l %%a in (1,1,%bar.width%) do call set "bar=%bar.char%%%bar%%"
call set /p "out=%%bar%%" <nul
set abort=
goto :EOF
)
::
if defined abort goto :EOF
::
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | find /i "robocopy.exe" >nul
::
if errorlevel 1 set abort=1 & set loop.delay=1
::
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "remain=%%b,done=%%c"
)
::
set /a bar.step=(total / bar.width) - 1
::
if %bar.step% LEQ 0 set bar.step=1
::
set /a bar.position.modifier=bar.width / total
if %bar.position.modifier% LEQ 0 set /a bar.position.modifier=1
::
set /a bar.position=(done / bar.step) * bar.position.modifier
::
if %bar.position% GTR %bar.width% set /a bar.position=bar.width
::
for /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar%%"
::
set /p "out=%bar%" <nul
::
title %done% / %total%
::
ping 127.1 -n %loop.delay% -w 1000 >nul
::
goto :loop
:: ==========================================================
:vista_outlook
::
SET "rc.command=%rc% "%source%." "%target%." "%_back_outlook%" %_robo_outlook_1%"
::
echo Starting Outlook Backup ...... Please Wait
::
for /f "usebackq tokens=2" %%a in (`mode con ^| find "Columns:"`) do set /a bar.width=%%a - 3
::
REM set "bar.width=40"
set "bar.char=þ"
set "bar.backchar=ú"
set "bar.size=0"
set "bar.back="
set "bar.del="
set "bar.position=0"
set "bar.position.modifier=0"
set "bar.check=0"
set "loop.delay=3"
set "done=0"
set "total=-1"
set "abort="
::
set "window.title=%rc%_%date%_%time: =0%"
::
echo:START
echo.
start /min "%window.title%" %rc.command%
::
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "total=%%a,done=%%c"
)
::
set /a "bar.check=bar.width / total" 2>nul
::
if %bar.check% EQU 1 set /a bar.width=total
::
for /l %%a in (1,1,%bar.width%) do (call set "bar.back=%%bar.back%%%bar.backchar%")
call set "bar.del=%%bar.back:%bar.backchar%=%%"
set /p "out=[%bar.back%]%bar.del%" <nul
::
set /a loop.delay+=1
::
title Please stand by...
::
call :loop
::
echo:
echo.
::
if defined abort (echo:ABORT) ELSE (echo:END)
::
goto :vista_firefox
::
:loop
::
set bar=
::
if %done% GEQ %total% (
title %done% / %total%
for /l %%a in (1,1,%bar.width%) do call set "bar=%bar.char%%%bar%%"
call set /p "out=%%bar%%" <nul
set abort=
goto :EOF
)
::
if defined abort goto :EOF
::
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | find /i "robocopy.exe" >nul
::
if errorlevel 1 set abort=1 & set loop.delay=1
::
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "remain=%%b,done=%%c"
)
::
set /a bar.step=(total / bar.width) - 1
::
if %bar.step% LEQ 0 set bar.step=1
::
set /a bar.position.modifier=bar.width / total
if %bar.position.modifier% LEQ 0 set /a bar.position.modifier=1
::
set /a bar.position=(done / bar.step) * bar.position.modifier
::
if %bar.position% GTR %bar.width% set /a bar.position=bar.width
::
for /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar%%"
::
set /p "out=%bar%" <nul
::
title %done% / %total%
::
ping 127.1 -n %loop.delay% -w 1000 >nul
::
goto :loop
:: ==========================================================
:vista_firefox
first section works fine second one igores the preset filetypes
Last edited by Chimaera (24 Mar 2010 09:02)
----------------------------
#24 Mar 2010 09:18
bluesxman
No offense but that's a right old mess. You ought to be doing something along these lines (based on my original rather than your version):
Code: Select all
@echo off
set "rc=robocopy.exe"
set "source=e:\test\source1"
set "target=e:\test\target1"
call :main_body "Backup 1"
set "source=e:\test\source2"
set "target=e:\test\target2"
call :main_body "Backup 2"
set "source=e:\test\source3"
set "target=e:\test\target3"
call :main_body "Backup 3"
pause
goto :EOF
:main_body
set "rc.command=%rc% "%source%." "%target%." /s"
REM make the bar as wide as possible
for /f "usebackq tokens=2" %%a in (`mode con ^| find "Columns:"`) do set /a bar.width=%%a - 3
REM or you can force the width on the next line (no sanity checking is done on this value)
REM set "bar.width=40"
set "bar.char=þ"
set "bar.backchar=ú"
set "bar.size=0"
set "bar.back="
set "bar.del="
set "bar.position=0"
set "bar.position.modifier=0"
set "bar.check=0"
set "loop.delay=3"
set "done=0"
set "total=-1"
set "abort="
set "window.title=%rc%_%date%_%time: =0% %~1"
echo:START %~1
REM spawn the robocopy command with a (hopefully) unique window title that we'll need later
start /min "%window.title%" %rc.command%
REM find the total number of files, so we can shrink the bar to fit the total, if necessary
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "total=%%a,done=%%c"
)
set /a "bar.check=bar.width / total" 2>nul
if %bar.check% EQU 1 set /a bar.width=total
REM draw the empty bar
for /l %%a in (1,1,%bar.width%) do (call set "bar.back=%%bar.back%%%bar.backchar%")
call set "bar.del=%%bar.back:%bar.backchar%=%%"
set /p "out=[%bar.back%]%bar.del%" <nul
set /a loop.delay+=1
title Please stand by...
call :loop
echo:
if defined abort (echo:ABORT %~1) ELSE (echo:END %~1)
REM pause
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::
set bar=
REM if all the files have been copied, draw a full bar (in case it didn't get filled
REM on the previous iteration) and exit
if %done% GEQ %total% (
title %done% / %total%
for /l %%a in (1,1,%bar.width%) do call set "bar=%bar.char%%%bar%%"
call set /p "out=%%bar%%" <nul
set abort=
goto :EOF
)
REM if the robocopy child process wasn't running on the previous iteration and there
REM are still files left uncopied then we assume that robocopy died unexpectedly
if defined abort goto :EOF
REM check for the robocopy child process (using out "unique" window title)
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | findstr "." >nul
REM if it's not found, set a flag (it'll be dealt with on the next interation)
if errorlevel 1 set abort=1 & set loop.delay=1
REM run a duplicate robocopy process with the "/L" switch to so we can extract
REM the total number of files and those that have been copied from the output
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "remain=%%b,done=%%c"
)
REM figure out (roughly) how many files need to be copied to increase the progress
REM bar by one step
set /a bar.step=(total / bar.width) - 1
REM in case its less than one...
if %bar.step% LEQ 0 set bar.step=1
REM calculate the bar modifier, which takes effect if the total number of files
REM is significantly lower than the bar width.
set /a bar.position.modifier=bar.width / total
if %bar.position.modifier% LEQ 0 set /a bar.position.modifier=1
REM calculate the position using the number of copied files and the step value
set /a bar.position=(done / bar.step) * bar.position.modifier
REM if for some reason the position is greater than the width, fix it
REM (this would occur if the number of files is not much more than
REM the defined bar width)
if %bar.position% GTR %bar.width% set /a bar.position=bar.width
REM draw the bar (we're redrawing the whole thing on each interation)
for /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar%%"
set /p "out=%bar%" <nul
title %done% / %total%
REM delay before interating so that the script doesn't thrash the system
ping 127.1 -n %loop.delay% -w 1000 >nul
goto :loop
Last edited by bluesxman (24 Mar 2010 18:41)
cmd | *sh | ruby | chef
----------------------------
#31 May 2010 09:56
bluezip
to bluesxman
thanx so much.... but ur script 200MB over file not check progress bar...
how solve it?
pls reply me....
----------------------------
#31 May 2010 11:09
bluesxman
Sorry but I don't understand the question.
cmd | *sh | ruby | chef
----------------------------
#06 Sep 2010 09:28
pnorling
bluesxman: Thanks for your script it is exactly what I've been looking for...but....when I run the script the bar (bar.width=50) looks OK but once the script starts to redraw the bar the bar.char is written behind the bar it self like this:
START SiteComputer 1
[··················································]*****************************************************************************************************************************
and it just continues to expand outside the bar.width and wraps to the next row until it's done with the copy....
I've also noticed that if the copy already exists (100% done) the bar.chars will be equal to the bar.width (50) but it will still be printed as
START SiteComputer 1
[··················································]**************************************************
END
I've done some adaptations to the script but that should not have anything to do with the messed up printout since I get the same "error" using your original script
Any ideas why?
----------------------------
#08 Sep 2010 09:49
Chimaera
Mine has changed as well from the original that i had, i managed to get mine working again by adding an extra character which the forum seems to be blocking, i think when the forum changed it stops the character which is a square with little numbers
inside it, i dont know what the char is actually called
you need to add one after the red character and one either side of the second one
Andcall set "bar.del=%%bar.back:%bar.backchar%=%%"
It seems to need the extra characters to work rightfor /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar%%"
Hope this works for you
@Simon Can you have a look at why the forum is blocking the special Character please as i pasted it in the post but as soon as i submitted it it wiped it from the text
Last edited by Chimaera (08 Sep 2010 10:25)
----------------------------
#08 Sep 2010 10:44
bluesxman
Ah yes, I think the new version of the forum is blocking the "backspace" character than is used heavily.
cmd | *sh | ruby | chef
----------------------------
#08 Sep 2010 10:44
pnorling
Thanks Chimaera it got better but not perfect sad
I still get the faulty position of the output
START SiteComputer 1
[--------------------------------------------------]***************
And when the rc is running the amount of "*" is incorrectly printed. The rc contains of ~3500 files, when almost all files have been copied the amount of written "*" was only 15 (bar.width=50). Once the copy was done the script did a M$-jump and printed out the remaining 35 "*"
START SiteComputer 1
[--------------------------------------------------]**************************************************
END
I know it's not easy to troubleshoot a script without seeing it so here goes:
Code: Select all
@echo off
title Please stand by....
rem net use p: /delete /y
net use q: /delete /y
net use \\192.168.0.20\c$ /delete /y
net use \\192.168.0.21\c$ /delete /y
net use \\192.168.0.22\c$ /delete /y
net use \\192.168.0.23\c$ /delete /y
net use \\192.168.0.24\c$ /delete /y
cls
rem net use p: /USER:rc \\192.168.0.6\c$
for /f "delims=" %%a in (
'dir "P:\TestProcessed\*.*" /b /od'
) do set "dir=%%a"
setlocal
setlocal enabledelayedexpansion
set x-factor=100000000000
set num1=%dir%
set num2=%x-factor%
echo "%dir%">len1.tmp
echo "%x-factor%">len2.tmp
call :getlen len1.tmp len2.tmp
if %len1% equ %len2% (
set /a len = len1
call :COMPARE
) else (
if %len1% gtr %len2% (
set /a len = len1
set /a dif = len1 - len2
) else (
set /a len = len2
set /a dif = len2 - len1
set tmp=%num1%
set num1=%num2%
set num2=!tmp!
)
for /l %%a in (1,1,!dif!) do set num2=0!num2!
)
set /a len-=1
set carry=0
for /l %%a in (!len!,-1, 0) do (
set /a digit = !num1:~%%a,1! + !num2:~%%a,1! + !carry!
if !digit! geq 10 (
set /a carry = 1
set /a digit = !digit! %% 10
) else (
set carry = 0
)
set sum=!digit!!sum!
)
if %carry% equ 1 set sum=1%sum%
set new_dir=%sum%
goto CD-COPY
:COMPARE
set flag=
for /l %%a in (0,1,!len!) do (
if not defined flag (
set i=%%a
if %num1:~%%a,1% gtr %num2:~%%a,1% (
set flag=1
) else (
if %num2:~%%a,1% gtr %num1:~%%a,1% (
set flag=1
set tmp=!num1!
set num1=!num2!
set num2=!tmp!
)
)
)
)
exit /b
:GETLEN
set /a %~n1 = %~z1 - 4
set /a %~n2 = %~z2 - 4
del %1 %2
exit /b
:CD-COPY
net use q: /USER:rc \\192.168.0.20\c$
set "rc=robocopy.exe"
set "source=P:\TestProcessed\%dir%"
set "target=q:\temp\test\"
cls
call :main_body "SiteComputer 1"
title Please stand by....
net use q: /delete /y
net use q: /USER:rc \\192.168.0.21\c$
cls
call :main_body "SiteComputer 2"
title Please stand by....
net use q: /delete /y
net use q: /USER:rc \\192.168.0.22\c$
cls
call :main_body "SiteComputer 3"
title Please stand by....
net use q: /delete /y
net use q: /USER:rc \\192.168.0.23\c$
cls
call :main_body "SiteComputer 4"
title Please stand by....
net use q: /delete /y
net use q: /USER:rc \\192.168.0.24\c$
cls
call :main_body "SiteComputer 5"
goto :EOF
:MAIN_BODY
set "rc.command=%rc% /E /NP /TEE %source% %target%"
REM make the bar as wide as possible
rem for /f "usebackq tokens=2" %%a in (`mode con ^| find "Columns:"`) do set /a bar.width=%%a - 3
set "bar.width=50"
set "bar.char=*"
set "bar.backchar=-"
set "bar.size=0"
set "bar.back="
set "bar.del="
set "bar.position=0"
set "bar.position.modifier=0"
set "bar.check=0"
set "loop.delay=3"
set "done=0"
set "total=-1"
set "abort="
set "window.title=%rc%_%date%_%time: =0% %~1"
echo:START %~1
REM spawn the robocopy command with a (hopefully) unique window title that we'll need later
start /min "%window.title%" %rc.command%
REM find the total number of files, so we can shrink the bar to fit the total, if necessary
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "total=%%a,done=%%c"
)
set /a "bar.check=bar.width / total" 2>nul
if %bar.check% EQU 1 set /a bar.width=total
REM draw the empty bar
for /l %%a in (1,1,%bar.width%) do (call set "bar.back=%%bar.back%%%bar.backchar%")
call set "bar.del=%%bar.back:%bar.backchar%=%%*"
set /p "out=[%bar.back%]%bar.del%" <nul
set /a loop.delay+=1
title Please stand by...
call :LOOP
echo:
if defined abort (echo:ABORT %~1) ELSE (echo:END %~1)
timeout 60
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:LOOP
:::::::::::::::::::::::::::::::::::::::::::::::::::::
set bar=
REM if all the files have been copied, draw a full bar (in case it didn't get filled
REM on the previous iteration) and exit
if %done% GEQ %total% (
title CD transfer in progress....Copying file %done% / %total%
for /l %%a in (1,1,%bar.width%) do call set "bar=%bar.char%%%bar%%"
call set /p "out=%%bar%%" <nul
set abort=
goto :EOF
)
REM if the robocopy child process wasn't running on the previous iteration and there
REM are still files left uncopied then we assume that robocopy died unexpectedly
if defined abort goto :EOF
REM check for the robocopy child process (using out "unique" window title)
tasklist /fi "imagename eq robocopy.exe" /fi "windowtitle eq %window.title%" /fo csv /nh 2>nul | findstr "." >nul
REM if it's not found, set a flag (it'll be dealt with on the next interation)
if errorlevel 1 set abort=1 & set loop.delay=1
REM run a duplicate robocopy process with the "/L" switch to so we can extract
REM the total number of files and those that have been copied from the output
for /f "usebackq tokens=3,4,5 delims= " %%a in (`%rc.command% /l /njh /nfl /ndl ^| find "Files"`) do (
set /a "remain=%%b,done=%%c"
)
REM figure out (roughly) how many files need to be copied to increase the progress
REM bar by one step
set /a bar.step=(total / bar.width) - 1
REM in case its less than one...
if %bar.step% LEQ 0 set bar.step=1
REM calculate the bar modifier, which takes effect if the total number of files
REM is significantly lower than the bar width.
set /a bar.position.modifier=bar.width / total
if %bar.position.modifier% LEQ 0 set /a bar.position.modifier=1
REM calculate the position using the number of copied files and the step value
set /a bar.position=(done / bar.step) * bar.position.modifier
REM if for some reason the position is greater than the width, fix it
REM (this would occur if the number of files is not much more than
REM the defined bar width)
if %bar.position% GTR %bar.width% set /a bar.position=bar.width
REM draw the bar (we're redrawing the whole thing on each interation)
for /l %%a in (1,1,%bar.position%) do call set "bar=%bar.char%%%bar*%%*"
set /p "out=%bar%" <nul
title CD transfer in progress....Copying file %done% / %total%
timeout 5 >nul
rem ping 127.1 -n %loop.delay% -w 1000 >nul
goto :LOOP
:EOF
net use q: /DELETE /Y
rem net use p: /DELETE /Y
----------------------------
#09 Sep 2010 20:02
Chimaera
Member
mine works fine here now Ive added the extra character
i did notice however that it dosen't work when i define the length of the progress bar for some reason.
have you tried define the window instead and let the bar run as normal?
And bear in mind as bluesxman says earlier in the thread this is not an exact science due to windows files it cannot access etc so it may not report correctly
Last edited by Chimaera (09 Sep 2010 20:06)
----------------------------
#06 Mar 2012 17:27
mendes
hi guys.. need some help with this script ...
Everything works fine .. adapted the script to my stuff but have one tiny tiny problem ..
As mention above the bar is drawn like this [---------------------------]*******************
And for the love of god everyone is talking about the missing character ... but i do not understand it what backspace character are u talking about ... "square with small numbers in it ?" Ithere isn't that character on the ascii table ...
Can anyone upload de bat file somewhere so i can download it and see ...
Thanks in advance !
----------------------------
#11 Apr 2018 13:58
redeemer666
Helo guys.
Old post but can you please explain how to put the backspace character inside the script? Thanks
----------------------------
#11 Apr 2018 18:22
Shadow Thief
You probably noticed that the post above yours has the same problem. This is because at some point, the forum software removed the backspace characters.redeemer666 wrote:
Helo guys.
Old post but can you please explain how to put the backspace character inside the script? Thanks
Originally, the code above had an actual backspace character (ASCII value 8) at the end of one of the set lines (I'm not sure which one, and I don't care since there are better ways to get a backspace character that I'm about to mention). If you absolutely insist on setting a backspace character this way, you can open a text editor that's more advanced than regular Notepad (I'm using Notepad++ but Ultraedit should work as well), hold ALT, and press 008 on the keypad. Since this method is clearly not useful for posting code online, I recommend not doing this.
A better way to generate a backspace character is to take advantage of the prompt command.
Code: Select all
for /F %%A in ('echo prompt $H ^| cmd') do set "BS=%%A"