set /A err=0
Set Dossier="C:\temp"
For /F %%I In (DIR %Dossier% /a:-d ^| find "File"') DO set /A wfile=%%i
if %wfile% GEQ 1 (
echo %wfile% OK
echo %wfile% file in %Dossier%
set err=%err%+%ERRORLEVEL%
) else (
echo %wfile% KO
echo file doesn't exist in %Dossier%
set err=%err%+0
)
Category: Windows
Escape Characters
Character to be escaped | Escape Sequence | Remark |
% | %% | |
^ | ^^ | May not always be required in doublequoted strings, but it won’t hurt |
& | ^& | |
< | ^< | |
> | ^> | |
| | ^| | |
‘ | ^’ | Required only in the FOR /F « subject » (i.e. between the parenthesis), unless backq is used |
` | ^` | Required only in the FOR /F « subject » (i.e. between the parenthesis), if backq is used |
, | ^, | Required only in the FOR /F « subject » (i.e. between the parenthesis), even in doublequoted strings |
; | ^; | |
= | ^= | |
( | ^( | |
) | ^) | |
! | ^^! | Required only when delayed variable expansion is active |
« | « » | Required only inside the search pattern of FIND |
\ | \\ | Required only inside the regex pattern of FINDSTR |
[ | \[ | |
] | \] | |
« | \ » | |
. | \. | |
* | \* | |
? | \? |
Purge de fichiers FORFILES chemins UNC
set w_dir=%1
set w_nb_jrs=%2
echo Purge de la Directorie : %w_dir%
echo Purge des fichiers et dossiers vieux de plus de %w_nb_jrs% jours
echo Espace avant purge
dir %w_dir%..
pushd %w_dir%
dir
echo « ———————————————–«
FORFILES /S /D -%w_nb_jrs% /C « cmd /c dir @path » 2> nul
set erreurcode=%errorlevel%
if « %erreurcode% » equ « 0 » goto SUITE1
goto FIN
:SUITE1
forfiles /S /D -%w_nb_jrs% /C « cmd /c del /f /q @path » 2> nul
forfiles /S /D -%w_nb_jrs% /C « cmd /c rd /S /Q @path » 2> nul
echo « Effacement des dossiers et fichiers ci-dessus »
echo Espace après purge
dir
:FIN
PopD
set errorlevel=0
Dossier vide sous windows
setlocal ENABLEDELAYEDEXPANSION
set dossier =%1
set /A P1=0
for /R %dossier% %%i in (.) do (if « %%~zi » geq « 1 » ( set /A P1=!P1!+1 ))
if !P1! equ 0 (echo « Le dossier « %dossier% » est vide » && exit /B 0)
accent avec robocopy
Lorsque le chemin vers un répertoire source ou destination de votre script robocopy contient un accent, il est possible, selon la configuration de votre système Windows, que vous obteniez une erreur. En effet DOS n’arrivera pas à interpréter cet accent et ne va donc pas trouver le chemin du répertoire spécifié …
Afin que les accents soient correctement interprétés il suffit de rajouter la commande suivante au début de votre script.
chcp 1252
La commande chcp, intégrée nativement à Windows, permet de modifier le jeu de caractère (ou « code page ») de votre système d’exploitation. Le code page 1252 est le code page original de Windows, pour l’Europe de l’ouest et donc la France. Il peut arriver que le code page d’un système ne soit pas 1252 et que les accents soient donc mal interprétés.
En ajoutant cette commande en début de script, vous améliorerez leur portabilité afin qu’ils fonctionnent sur n’importe quel ordinateur ayant un code page différent.
création de fichier vide
fsutil file createnew dir_name1\dir_name2\dir_name…\file_name.txt 0
del /f /q L:\dir_name1\dir_name2\dir_name…\file_name.txt
présence fichier dans dossier
echo off
setlocal enabledelayedexpansion
set w_dos=\\Vstream.ft.grp\g$\M3toECM\WIT_ECM\*.* \\vstream.ft.grp\g$\M3toECM\LPZ_ECM\*.* \\vstream.ft.grp\g$\M3toECM\NSF_ECM\*.*
set f_tmp=L:\Soft\VTOM\logs\liste_fic_ecm.txt
set /a cpt=0
dir /b %w_dos% > %f_tmp%
for /f « delims= » %%i in (‘type %f_tmp%’) do set /a cpt+=1
echo nombre de fichier à traiter : !cpt!
IF %cpt% EQU 0 exit /B 0 (on sort)
il y a des fichiers à traiter
robocopy MOVE fichiers
//WCTSRV0016/Batch_win/robocopy_dir_MOVE.bat
test dossier vide
move des fichiers
horodatage du log
affichage du log
setlocal enabledelayedexpansion echo === Transfert Robocopy === rem ------------------------------ rem Horodatage reg add "HKCU\Control Panel\International" /v sShortDate /d "dd-MM-yyyy" /f for /F "tokens=1-4 delims=/" %%a in ('echo %date:~0,10%') do set w_date=%%c%%b%%a for /F "tokens=1-4 delims=-" %%a in ('echo %date:~0,10%') do set w_date=%%c%%b%%a for /F "tokens=1-4 delims=:" %%a in ('echo %time:~0,8%') do set w_time=%%a%%b%%c set w_horo=%w_date%_%w_time% set w_source=%1 set w_cible=%2 rem ------ horodatage du log set w_log=%3\%w_horo%_%TOM_JOB%.vlog set /a w_err=8 echo source : %w_source% echo cible : %w_cible% echo log : %w_log% echo --- source ------------- rem -- recherche si fichier à traiter set f_tmp=L:\Soft\VTOM\logs\liste_fic_%TOM_JOB%.txt set /a cpt=0 dir /b %w_source% > %f_tmp% for /f "delims=" %%i in ('type %f_tmp%') do set /a cpt+=1 echo nombfre de fichier à traiter : !cpt! IF !cpt! EQU 0 exit /B 0 dir %w_source% echo --- cible avant ------------- dir %w_cible% echo Move echo robocopy %w_source% %w_cible% /S /Move /w:10 /r:2 /LOG+:%w_log% robocopy %w_source% %w_cible% /S /Move /w:10 /r:2 /LOG+:%w_log% set /a w_err=%w_err%+%errorlevel% mkdir %w_source% echo --- cible après ------------- dir %w_cible% rem ---- affichage du log type %w_log% set /a w_err=%w_err%-8 exit /B %w_err%
test transfert ftp
set ftp_log=transfert_ftp.log
for /f « delims= » %%a in (‘find /C « 150 Opening » ^<%ftp_log%’) do set /a w_files=%%a
@echo nombre de fichier a transferer : %w_files%
for /f « delims= » %%a in (‘find /C « 226 Transfer complete » ^<%ftp_log%’) do set /a w_files_ok=%%a
@echo nombre de fichier transfere OK : %w_files_ok%
IF %w_files% NEQ %w_files_ok% (type %ftp_log% & echo « Terminé en erreur » & exit /B %errorlevel%)
echo Transfert OK
vtom_ftp_win_linux_mget.bat
@echo off
echo Transfert FTP… WINDOWS
set w_ftp=%1
set w_user=%2
set w_pwd=%3
set w_source=%4
set w_cible=%5
set l_cible=%6
echo source : (%w_ftp%) %w_source%
echo cible : (%TOM_HOST%) %l_cible%%w_cible%
echo ——————————-
echo.
%l_cible%
IF EXIST %w_cible% (
DEL /F /Q %w_cible%
) ELSE (
MKDIR %w_cible%
)
cd %w_cible%
echo.
cd %w_dir%
set dir_logs=%ABM_LOGS%
set ftp_log=%dir_logs%transfert_ftp_%TOM_JOB%.log
set ftp_ini=C:\temp\FTP_%TOM_JOB%_envoi.ini
rem ****************************************************
rem Récupération d’un fichier avec un get
rem ****************************************************
echo open %w_ftp%>%ftp_ini%
echo %w_user%>>%ftp_ini%
echo %w_pwd%>>%ftp_ini%
echo cd %w_source%>>%ftp_ini%
echo ls -l>>%ftp_ini%
echo mget *.*>>%ftp_ini%
echo bye>>%ftp_ini%
ftp.exe -i -s:%ftp_ini% 1>%ftp_log%
Findstr « Transfer complete » %ftp_log%
IF %ERRORLEVEL% NEQ 0 (echo « Terminé en erreur » & exit /B %errorlevel%)
type %ftp_log%
echo ——————————-
echo.
dir
———- Param —
WCTSRV00554.wabtec.com
{oracle}
{ora112_pwd}
/u02/DUMP/FORMSPRD
\WCTSRV0060\FORMSPRD\{dt_aujourdhui,J_NOM}_dump
D:
pushd – popd
Je me place dans C: (par exemple)
C:
Je suis sur le volume C:
dir m’affiche le contenu de C:
pushd \\serveur\dossierA\dossierB\
pushd monte virtuellement un volume est y entre
Je suis donc dans \\serveur\dossierA\dossierB\
dir m’affiche le contenu de \\serveur\dossierA\dossierB\
….
Je peux manipuler des fichiers par exemple
Je fais ce que je veux à cet endroit.
….
popd
Je reviens dans à l’endroit où j’étais avant le pushd (C: dans notre exemple)
WinSCP en ligne de commande
L:\soft\winscp\WinSCP.com /log= »C:\temp\winscp_lin_liste.log » /command « open ftpes://user:password@host:port/ » « commande_1 » « commande_2 » « commande_3″ …
exemple :
L:\soft\winscp\WinSCP.com /log= »C:\temp\winscp_lin_liste.log » /command « open ftpes://M3:xxxx@172.25.xxx.xxx:990/ » « cd Prod/Purchasing_DWH » « ls *.csv » « exit »
Nettoyage windows
Supprimer le contenu des dossiers :
C:\Windows\SoftwareDistribution
C:\Windows\ccmcache
echo off
SETLOCAL enableExtensions enableDelayedExpansion
set w_user=%1
dir | findstr "free"
set f_tmp=c:\temp\liste_%w_user%.txt
dir C:\Users\%w_user%* /B > %f_tmp%
type %f_tmp%
rem rd /s c:\$Recycle.Bin
rem del /S /Q /F C:\Temp
rem del /S /Q /F C:\Windows\Temp
for /f %%i in (%f_tmp%) do (
del /S /Q /F C:\Users\%%i\AppData\Local\Temp 2>1
del /S /Q /F "C:\Users\%%i\AppData\Local\Microsoft\Windows\Temporary Internet Files" 2>1
)
dir | findstr "free"
espace dans les noms de fichiers
Remplacer les espaces par des _ dans les noms de fichier d’un dossier.
Sous Windows
cd mon_dossier for /f "delims=" %%a in ('dir /b') do call :cmd "%%a" exit :cmd set fichierbck=%~1 set fichier=%fichierbck: =_% ren "%fichierbck%" "%fichier%"
Sous Linux
rename 's/[[:blank:]]/_/g' *
Remplacement temporaire
#IFS = field separator, so only accept end of line and not space as filename may contain space SAVEIFS=$IFS IFS=$(echo -en "\n\b") for v_fic in `find ${w_rep_purge}/ -type f -mtime ${w_jour_purge} -name "*.${w_extension}" | grep ${w_grep}` do echo " - Suppression du fichier [${v_fic}] ..." # rm -f ${v_fic} ls -la ${v_fic} done #IFS = restore old filed separator to not changed stand shell comportement IFS=$SAVEIFS
Tailles d’une liste de fichiers dans un dossier
@echo Off setlocal enabledelayedexpansion cls set l_fic=l:\Soft\Vtom\temp\*.bat set p_file=l:\Soft\Vtom\temp\liste.txt if exist %p_file% del /S %p_file% 1> nul dir /B %l_fic% > %p_file% 2> nul set size=0 for /F %%I in (%p_file%) do ( echo %%I %%~zI set /a size=!size!+%%~zI ) echo -------------------------- echo taille total des fichiers %size%
date et heure de fichier
le parametre /T de la commande DIR
dir /TC –> Creation
dir /TA –> Last Access
dir /TW –> Last Written
@echo off cls set w_d=%date% %time:~0,5% echo %w_d% set fichier1=L:\Soft\VTOM\temp\archive_zip.bat set fichier2=L:\Soft\VTOM\temp\ftp_notilus_integre_FR3.bat echo %fichier1% echo %fichier2% for %%a in (%fichier1%) do set datebut=%%~ta for %%a in (%fichier2%) do set datesource=%%~ta rem on enleve l'espace entre date et temps echo %fichier1% %datebut% echo %fichier2% %datesource% set datebut=%datebut: =-% set datesource=%datesource: =-% if %datebut%==%datesource% ( echo meme date ) else ( echo date differente )
Test errorlevel
Linux
if [ $? -eq 0 ] then echo "good" else echo "bad" fi
Windows
IF %ERRORLEVEL% NEQ 0 ( commande1 & commande2 etc... )
IF %ERRORLEVEL% NEQ 0 GOTO label GOTO fin :label echo numero %errorlevel% > c:\erreur.txt echo chaine1 >> c:\erreur.txt echo chaine2 >> c:\erreur.txt :fin
Traitement fichier (ligne vide, taille zéro …)
Supprimer retour chariot dans le fichier file1.txt et ecriture dans file2.txt
findstr /vir « ^$ » file1.txt > file2.txt
Recherche de \In dans file2.txt et ecriture dans file3.txt
findstr « \In » file2.txt > file3.txt
Fichier non vide
for %%I in (file3.txt ) do ( set size=%%~zI )
If %size% LEQ 0 goto fin_prg1
Remote command
Linux :
Serveur :
plink -ssh -l root -pw mot_de_passe nom_du_serveur « commande »
Windows :
Services :
sc \\nom_du_serveur query nom_du_service » | find « RUNNING »
if !errorlevel! equ 0 sc \\nom_du_serveur stop « nom_du_service »
sc \\nom_du_serveur query nom_du_service
sc \\nom_du_serveur start nom_du_service
sc \\nom_du_serveur stop nom_du_service
Serveur :
shutdown /s /m \\nom_du_serveur /t 30 /c « BatchStop » /f /d p:4:1
QUSER /SERVER:nom_du_serveur
LOGOFF username /SERVER:nom_du_serveur /V
Psexec :
set PATH=%PATH%;c:\Program Files\pstools
L:\Soft\PsExec\psexec.exe \\nom_du_serveur cmd /c commande
psexec \\nom_du_serveur cmd /c change logon /query
psexec \\nom_du_serveur cmd /c change logon /enable
psexec \\nom_du_serveur cmd /c change logon /disable
Recherche de fichier dans une arborescence
dir /S * /A-D /B | find /V /C « :: » dir *.txt : liste le contenu du répertoire courant (ayant un nom se terminant par .txt) avec comme options :
| : transmet le résultat de la commande précédente à find find : cherche toutes les occurences :
—————————————————
G:\TST\ECM>dir /S * /A-D /B | find /V /C « :: »
16
G:\TST\ECM>echo %errorlevel%
0
G:\TST\ECM>dir /S *.tru /A-D /B | find /V /C « :: »
File Not Found
0
G:\TST\ECM>echo %errorlevel%
1
G:\TST\ECM>dir /S * /A-D /B | find /V « :: »
G:\TST\ECM\Archive\production.zip_20161012_110217.zip G:\TST\ECM\Archive\supplier.zip_20161012_100435.zip G:\TST\ECM\Archive\supplier.zip_20161012_104136.zip G:\TST\ECM\Archive\supplier.zip_20161012_110116.zip G:\TST\ECM\Archive\supplier.zip_20161012_111016.zip G:\TST\ECM\Archive\supplier.zip_20161012_92028.zip G:\TST\ECM\Archive\supplier.zip_20161012_93628.zip G:\TST\ECM\Log\20161012_100435_Tpush_pile_SUP.log G:\TST\ECM\Log\20161012_104136_Tpush_pile_SUP.log G:\TST\ECM\Log\20161012_110116_Tpush_pile_SUP.log G:\TST\ECM\Log\20161012_110217_Tpush_pile_PRD.log G:\TST\ECM\Log\20161012_111016_Tpush_pile_SUP.log G:\TST\ECM\Log\20161012_92028_Tpush_pile_SUP.log G:\TST\ECM\Log\20161012_93628_Tpush_pile_SUP.log G:\TST\ECM\SAS\SAS_PRD\liste_site_ecm_prd.txt G:\TST\ECM\SAS\SAS_SUP\liste_site_ecm_sup.txt
G:\TST\ECM>dir /S *.tru /A-D /B | find /V « :: »
File Not Found