Escape Characters

Character to be escapedEscape SequenceRemark
%%% 
^^^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
[\[
]\]
« \ »
.\.
*\*
?\?

Source

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

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.

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
)

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 :

/A-D : liste tout sauf les répertoires /B : utiliser le format abrégé (nom de fichier uniquement)

| : transmet le résultat de la commande précédente à find find : cherche toutes les occurences :

/V : n’étant pas vides (« :: ») /C : affiche le nombre de résultats trouvés

—————————————————

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