The Butter Connection

aka "stanguru.com" and "themargerums.com"

Computer Tips & Help
AS400
PC
Hardware
Programming
Web Development
Virus
Spyware/Malware
Spam
Hoax Don't Spread It
Sports
Cancer
Multiple Sclerosis
Election Stuff
Photography
Handy Links
Interesting
Cool Things
Gamer Stuff
Gallery
Clarion · SQL · SQL Dates · SQL RPG examples · Batch Files

Batch File Stuff

 

Links - external

 

Batch File Compiler - http://sourceforge.net/projects/batchcompiler/

 


Simple Tips

 

  • dir without headers/footers</STRONG>
    dir C:\directoryname /s /a:-d |find "/"
       /s will list subdirectories
       /a:-d will suppress directory entries
  • Where.exe (DOS command) - how to use
  •   - search path - where $path:cl*.dll

 

FOR command - also the strip characters
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490909(v=technet.10)?redirectedfrom=MSDN
type "FOR /?"

@ECHO OFF
SETLOCAL
set file=C:\Users\SOMEUSER\Desktop\fs.cfg
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
ECHO filefull=%%~fi
)

 

-- instead of %%f use %%~nxf (we combined n and x from above

for /f "delims=" %%f in (%file_list%) do (
 robocopy %serverupdatepath% %clientpath%\ %%~nxf /NJH /NJS
)

 

Command-line reference A-Z
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490890(v=technet.10)?redirectedfrom=MSDN

 

 

 


Robocopy Info and Tips

 

Syntax
http://technet.microsoft.com/en-us/library/cc733145%28WS.10%29.aspx

 

GUI
http://technet.microsoft.com/en-us/magazine/2006.11.utilityspotlight.aspx

 

Wiki
http://en.wikipedia.org/wiki/Robocopy

 

base needs of command line (the retries and wait...if left out you could lock up a job for awhile)
robocopy %SOURCE% %DESTINATION% /r:0 /w:1
/r:<N> = Specifies the number of retries on failed copies. The default value of N is 1,000,000 (one million retries).
/w:<N> = Specifies the wait time between retries, in seconds. The default value of N is 30 (wait time 30 seconds).


 



Exit the batch file and not close the CMD window - "exit /B"

My "Start /Wait" command won't wait

Compressed Executables - If you use the batch file "START /WAIT" command or the scripting "wsh.Run,,True" method and expect a program to wait -- but it doesn't wait -- well, the most likely cause is that the program you tried to run was "compressed". What happens is that the program decompresses itself in memory, starts the new decompressed version as a separate process, then terminates itself. The START command and wsh.Run method see the original program termination and assume everything is done! If you open your suspect executable in Notepad, you may see some information about what compression program was used. The most popular compression program is UPX. It's popular because it's free and it's excellent! Luckily, UPX can "decompress" the programs it compressed. For example, Symantec's free FixBlast Blaster virus removal tool is UPX compressed and is 133KB. Both START and wsh.Run can't monitor when FixBlast ends. However, if you use UPX to decompress the FixBlast.exe program, it's size jumps to 544KB and START and wsh.Run suddenly begin working as expected! But don't panic if you can't (or aren't allowed to) decompress a program. I show a few other ways of monitoring programs next...

 

ideas to accomplish wait - http://www.ericphelps.com/scripting/samples/index.htm#Run


 

 


Environment Variables

Default Values on Microsoft Windows XP vs Vista and UP (2008 and up)
more extensive list - http://www.scriptlogic.com/support/CustomScripts/environmentVariableReference.html
other - http://technet.microsoft.com/en-us/library/cc749104%28WS.10%29.aspx

display/get client name on Terminal Services box
%clientname% - will display console on a non-ts session

 

  Vista XP
Variable Typical value (May vary, depending on system) Typical value (May vary, depending on system)
%ALLUSERSPROFILE% C:\ProgramData C:\Documents and Settings\All Users
%APPDATA% C:\Users\(username}\AppData\Roaming C:\Documents and Settings\{username}\Application Data
%CommonProgramFiles% C:\Program Files\Common Files  
%COMPUTERNAME% {computername} {computername}
%COMSPEC% C:\Windows\System32\cmd.exe C:\Windows\System32\cmd.exe
%HOMEDRIVE% C: C:
%HOMEPATH% \Users\{username} \Documents and Settings\{username}
%LOCALAPPDATA% C:\Users\{username}\AppData\Local  
%PATH% C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem
%PATHEXT% .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF; .WSH; .MSC .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF; .WSH
%ProgramData% C:\ProgramData  
%PROGRAMFILES% Directory containing program files, usually C:\Program Files Directory containing program files, usually C:\Program Files
%PROMPT% Code for current command prompt format. Code is usually $P$G Code for current command prompt format. Code is usually $P$G
%Public% C:\Users\Public  
%SYSTEMDRIVE% The drive containing the Windows XP root directory, usually C: The drive containing the Windows XP root directory, usually C:
%SYSTEMROOT% The Windows XP root directory, usually C:\Windows The Windows XP root directory, usually C:\Windows
%TEMP% and %TMP% C:\Users\{Username}\AppData\Local\Temp C:\DOCUME~1\{username}\LOCALS~1\Temp
%USERNAME% {username} {username}
%USERPROFILE% C:\Users\{username} C:\Documents and Settings\{username}
%WINDIR% C:\Windows C:\Windows

Variable Value
%DATE% Current date in the format determined by the Date command
%TIME% Current time in the format determined by the Time command
%CD% Current directory with its full path
%ERRORLEVEL% Number defining exit status of a previous command or program
%RANDOM% Random number between 0 and 32767


 

 

 

 

 

 

 

 

 

 


How to get day of week, day of month, month and year values in a Windows DOS batch script?

 

If you use batch scripts in Windows to run your backups, you’ll probably find it useful to have date information available for naming your backup files.
There is a really easy way to get date related information in a batch script :

DAY OF WEEK

set dow=%date:~0,3%

This returns Mon to Sun.

 

DAY OF MONTH

set dom=%date:~7,2%

This returns a value between 01 to 31

 

MONTH OF YEAR

set moy=%date:~4,2%

This returns a value between 01 to 12.

 

YEAR

set year=%date:~10,4%

Returns for example, 2008.

 

Date Only

set MMDDCCYY=%date:~4,10%

Returns for example, 01/01/2008.

 


Close open file(s) and backup


 

net files | findstr /i "myfile.ext"
for /F %%a in ('net files ^|findstr /i "myfile.ext"') do net files %%a /close


rem -- for backing up dsswX.ext (security file for SDS, not needed for SSCS)
set WHATDIRTOBACKUP=\\servername\sharename\directory\
set ZIPLOC=\\servername\sharename\backupdirectory\
set CCYYMMDD=%date:~10,4%%date:~7,2%%date:~4,2%


copy %WHATDIRTOBACKUP%myfile.ext %ZIPLOC%myfile-%CCYYMMDD%.ext


pause

rem example from 
rem net files | findstr /i "amc.*\.exe"
rem for /F %%a in ('net files ^|findstr /i "\\amc.*\.exe"') do net files %%a /close

rem net files | findstr /i "amc.*\.dat"
rem for /F %%a in ('net files ^|findstr /i "\\amc.*\.dat"') do net files %%a /close

rem net files | findstr /i "muparser.dll"
rem for /F %%a in ('net files ^|findstr /i "muparser.dll"') do net files %%a /close


loop off an input file
@echo off
rem
rem This batch file will copy files from a server to a client
rem
set serverupdatepath=\\SERVERNAME\SHARE\DIR\
set inputfilename=%1

if "%1" == "" (
echo.
echo Input file is blank. call as NAMEOFBATCH.BAT input.txt
echo.
echo To create a file of computers use: NET VIEW ^> c:\computerlist.txt
echo.
echo %serverupdatepath%
echo.
goto EOF
)

if not exist %1 (
echo.Input file invalid.
goto EOF
)

goto DOIT

:EOF
pause
exit /B

:DOIT
for /f %%i in (%inputfilename%) do call :ACTIONS %%i
goto EOF

:ACTIONS
echo.%1
xcopy /y /d %serverupdatepath%*.*  \\%1\c$\CLIENTDIR\*.*

---end batch file to loop off inputfile

 



copy certain files found under a dir
set dSource=C:\Main directory\sub directory
set dTarget=D:\Documents
set fType=*.doc
for /f "delims=" %%f in ('dir /a-d /b /s "%dSource%\%fType%"') do (
    copy /V "%%f" "%dTarget%\" 2>nul )

 

real example

rem ----------------------------------------------------------------------------
set DIRTOPUTDATA=\\servername\sharename\%username%\email\
set DIRTOPUTDOCS=\\servername\sharename\%username%\docs\

@echo.
@echo.
@echo copy pst files...just the PSTs
@echo  from:%USERPROFILE% to:%DIRTOPUTDATA%
@echo .
@echo      Do NOT start OUTLOOK until this is done.
@echo .
rem
rem ***NOTE: this does not make duplicate distinctions, so if there is 2 with
rem          same name, then the last one found will be the one.
rem
set fType=*.pst
for /f "delims=" %%f in ('dir /a-d /b /s "%USERPROFILE%\%fType%"') do (
    xcopy "%%f" "%DIRTOPUTDATA%" /y/d 2>nul )

 


Check if ran today, and exit out

*** this will stamp the file with the date, and append to the file

 

set lastrunfile=\\servername\sharename\%username%\lastrun.txt

rem ----------------------------------------------------------------------------
@echo.
@echo....Checking for backup already executed today...if so exit
@echo.
if not exist %lastrunfile% echo 00/00/0000 > %lastrunfile%
(for /f %%a in (%lastrunfile%) do set LastRun=%%a) 2>>nul
if "%LastRun%"=="%date:~4,10%" (goto endit) else (echo %date:~4,10%>>%lastrunfile%)

 

rem do whatever you need to do here

 

:endit
@echo.
@echo.
@echo All done..............................
rem pause
exit


 




repetitive/recursive subdirectories removal batch file

Ok, if you have a recursive subdirectory problem with a never ending repetitive subdirectories that you cant delete with explorer or DOS…here ya go
I know looking at this batch file, your going “this aint gonna do anything”

 

DelFolder.bat contains:
@echo off
if {%1}=={} @echo Syntax: DelFolder FolderPath&goto :EOF
if not exist %1 @echo Syntax: DelFolder FolderPath - %1 NOT found.&goto :EOF
setlocal
set folder=%1
set MT="%TEMP%\DelFolder_%RANDOM%"
MD %MT%
RoboCopy %MT% %folder% /MIR
RD /S /Q %MT%
RD /S /Q %folder%
rem end batchfile

--------------------------------------
Robocopy explained
Usage :: ROBOCOPY source destination [file [file]...] [options]
/MIR :: MIRror a directory tree (equivalent to /E plus /PURGE)

So,
The batch file is creating a temp directory which has nothing in it
Robocopy then use that temp directory as the SOURCE (which is blank right) and the /MIR option says make the DESTINATION look like the source

 


Check OS for setting of users directory

 

SET version=Unknown

VER | find /i "5.0." > nul
IF %ERRORLEVEL% EQU 0 set version=2000
VER | find /i "5.1." > nul
IF %ERRORLEVEL% EQU 0 set version=XP
VER | find /i "5.2." > nul
IF %ERRORLEVEL% EQU 0 set version=2003
VER | find /i "6.0." > nul
IF %ERRORLEVEL% EQU 0 set version=Vista-7
VER | find /i "6.1." > nul
IF %ERRORLEVEL% EQU 0 set version=Vista-7


@echo.
@echo.
@echo   Your OS is = %version%
@echo.
@echo.
if %version%==Vista-7 (
set MYDOCSDIR=%userprofile%\Documents\
) else (
set MYDOCSDIR=%userprofile%\My Documents\
)

 

 


 Different Ways to check version

 

@echo off
set version=NONE
VER | find /i "5.0." > nul && set version=2000
VER | find /i "5.1." > nul && set version=XP
VER | find /i "5.2." > nul && set version=2003
VER | find /i "6.0." > nul && set version=Vista
VER | find /i "6.1." > nul && set version=Win7
VER | find /i "6.2." > nul && set version=Win8
VER | find /i "6.3." > nul && set version=Win8
echo %version%
set version=NONE
if %version% == NONE ( systeminfo | find /i "Microsoft Windows XP" > nul && set version=WinXP )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows Vista" > nul && set version=WinVista )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows 7" > nul && set version=Win7 )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows 8" > nul && set version=Win8 )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows Server 2000" > nul && set version=WinServer2000 )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows Server 2003" > nul && set version=WinServer2003 )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows Server 2008" > nul && set version=WinServer2008 )
if %version% == NONE ( systeminfo | find /i "Microsoft Windows Server 2012" > nul && set version=WinServer2012 )
echo %version%
pause

 

 

 


 

Example of variables of files

taken from - http://zoril.co.uk/stuff/batchvars.php

@echo OFF
rem -- By Lewis
rem -- zoril.co.uk
echo --------------
echo - THIS  FILE -
echo --------------
echo.
rem - drive of file
echo [ Drive ][ %%~d0 ] %~d0
rem - path of file [ no filename or drive ]
echo [ Path  ][ %%~p0 ] %~p0
rem - path of file
echo [ Path  ][   %%0 ] %0
echo [ Path  ][ %%~f0 ] %~f0
rem - short path of file
echo [ Short ][ %%~s0 ] %~s0
rem - name of file [ no extension ]
echo [ Name  ][ %%~n0 ] %~n0
rem - extension of file
echo [ Exten ][ %%~x0 ] %~x0
rem - modified time of file
echo [ Time  ][ %%~t0 ] %~t0
rem - bytesize of file
echo [ Size  ][ %%~z0 ] %~z0
echo.
echo.
echo --------------
echo - INPUT FILE -
echo --------------
echo.
rem - drive of file
echo [ Drive ][ %%~d1 ] %~d1
rem - path of file [ no filename or drive ]
echo [ Path  ][ %%~p1 ] %~p1
rem - path of file
echo [ Path  ][   %%1 ] %1
echo [ Path  ][ %%~f1 ] %~f1
rem - short path of file
echo [ Short ][ %%~s1 ] %~s1
rem - name of file [ no extension ]
echo [ Name  ][ %%~n1 ] %~n1
rem - extension of file
echo [ Exten ][ %%~x1 ] %~x1
rem - modified time of file
echo [ Time  ][ %%~t1 ] %~t1
rem - bytesize of file
echo [ Size  ][ %%~z1 ] %~z1

 

echo.
echo.
echo.
rem a line with an a in
echo %~a1


pause > nul

 

 
The Current File
Percent Code Result Example
%~d0 Drive H:
%~p0 Path (No Drive) \Notes\
%0 Full Quoted Path "H:\Notes\batch_variables.bat"
%~f0 Full Path H:\Notes\batch_variables.bat
%~s0 8.3 Short Path H:\Notes\BATCH_~1.bat
%~n0 Filename (No Extension) batch_variables
%~x0 File Extension .bat
%~t0 Modified Time 10/12/2009 05:46
%~z0 File Size (bytes) 1233
 
The Input File
Percent Code Result Example
%~d1 Drive C:
%~p1 Path (No Drive) \Program Files (x86)\Mozilla Firefox\
%1 Full Quoted Path "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
%~f1 Full Path C:\Program Files (x86)\Mozilla Firefox\firefox.exe
%~s1 8.3 Short Path C:\PROGRA~2\MOZILL~1\firefox.exe
%~n1 Filename (No Extension) firefox
%~x1 File Extension .exe
%~t1 Modified Time 28/10/2008 14:46
%~z1 File Size (bytes) 908280

 

 

 


 

Backup batch file for a PC to wherever (mainly designed to backup to a server and share)

@echo off
set DOW=%date:~0,3%
set dom=%date:~7,2%
set moy=%date:~4,2%
set year=%date:~10,4%

set skipdocs=Y

rem set DIRTOPUTDATA=c:\temp\test\email\
rem set DIRTOPUTDOCS=c:\temp\test\docs\
set DIRTOPUTDATA=\\servername\sharename\%username%\email\
set DIRTOPUTDOCS=\\servername\sharename\%username%\docs\

set lastrunfile=\\servername\sharename\%username%\lastrun.txt

rem ----------------------------------------------------------------------------
@echo.
@echo....Checking for backup already executed today...if so exit
@echo.
if not exist %lastrunfile% echo 00/00/0000 > %lastrunfile%
(for /f %%a in (%lastrunfile%) do set LastRun=%%a) 2>>nul
if "%LastRun%"=="%date:~4,10%" (goto endit) else (echo %date:~4,10%>>%lastrunfile%)

rem pause

rem ----------------------------------------------------------------------------
@echo.
@echo.
@echo....Backing up your personal Docs to server
@echo.
@echo.
@echo   setting my docs directory

SET version=Unknown

VER | find /i "5.0." > nul
IF %ERRORLEVEL% EQU 0 set version=2000
VER | find /i "5.1." > nul
IF %ERRORLEVEL% EQU 0 set version=XP
VER | find /i "5.2." > nul
IF %ERRORLEVEL% EQU 0 set version=2003
VER | find /i "6.0." > nul
IF %ERRORLEVEL% EQU 0 set version=Vista-7
VER | find /i "6.1." > nul
IF %ERRORLEVEL% EQU 0 set version=Vista-7


@echo.
@echo.
@echo   Your OS is = %version%
@echo.
@echo.
if %version%==Vista-7 (
set MYDOCSDIR=%userprofile%\Documents\
) else (
set MYDOCSDIR=%userprofile%\My Documents\
)

rem ----------------------------------------------------------------------------
@echo.
@echo.
@echo create the dirs if they dont exist
if not exist %DIRTOPUTDATA% md %DIRTOPUTDATA%

rem ----------------------------------------------------------------------------
@echo.
@echo.
@echo killing outlook
taskkill /im outlook.exe

rem ----------------------------------------------------------------------------
rem waste some time waiting for outlook to die
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n 2 -w 1000> nul

rem ----------------------------------------------------------------------------
@echo.
@echo.
@echo copy pst files...just the PSTs
@echo  from:%USERPROFILE% to:%DIRTOPUTDATA%
@echo .
@echo      Do NOT start OUTLOOK until this is done.
@echo .
rem
rem ***NOTE: this does not make duplicate distinctions, so if there is 2 with
rem          same name, then the last one found will be the one.
rem
set fType=*.pst
for /f "delims=" %%f in ('dir /a-d /b /s "%USERPROFILE%\%fType%"') do (
    xcopy "%%f" "%DIRTOPUTDATA%" /y/d 2>nul )

 

rem backup the autofill file from Outlook 2007
set fType=*.nk2
for /f "delims=" %%f in ('dir /a-d /b /s "%USERPROFILE%\%fType%"') do (
    xcopy "%%f" "%DIRTOPUTDATA%" /y/d 2>nul )


if %skipdocs% == Y (
goto endit
)
   
rem ----------------------------------------------------------------------------
@echo.
@echo.
@echo copy the documents directory from:%MYDOCSDIR% to:%DIRTOPUTDOCS%
rem
rem %USERPROFILE%
robocopy %MYDOCSDIR% %DIRTOPUTDOCS% *.* /MIR /r:0

:endit
@echo.
@echo.
@echo All done..............................
rem pause
exit


 

----end batch file-----------------------------------------------   


 


 

 

 


 


You are here: Home-Computer Tips & Help-Programming-Batch Files

Previous Topic: SQL RPG examples