Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

Difference between revisions of "Windows7:Script Tips"

From Aino Wiki

Jump to: navigation, search
(Anomalie)
 
(No difference)

Latest revision as of 17:59, 7 November 2025

Windows ha due command shells (interprete comandi): la "Command shell" e "PowerShell". Ogni shell è un programma che fornisce diretta comunicazione tra l'operatore ed il sistema operativo o applicazione, fornendo un ambiente per automatizzare operazioni.

Shell DOS, Prompt comandi

Il Linguaggio di Scripting

Proveniente dal DOS, son stati aggiunti nuovi comandi ed istruzioni

IF

Esempio per la verifica se un file\directory esiste:
rem oppure:    if not exist
rem per le cartelle valutare così:  if exist "F:\tmp\*.*
rem per i nomi di files/cartelle con con spazi in mezzo usare i doppi apici all'inizio ed alla fine --> "nome file.ext"
 
if exist "F:\tmp\fileCivetta" (
    rem file Esiste
) else (
    rem file non esiste
)

Operatori usuali
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command


Operatori numerici

Operatore Significato
NEQ not equal
LSS less than
LEQ less than or equal
GTR greater than
GEQ greater than or equal

Esempio:

rem Get elapsed time:
set /A elapsed=end-start
rem Show elapsed time:
set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
if %mm% lss 10 set mm=0%mm%
if %ss% lss 10 set ss=0%ss%
if %cc% lss 10 set cc=0%cc%

FOR

Da Microsoft: for
Esempio 1

for /F "tokens=1-4 delims=:.," %%a in ("%time%") do (
   set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)

Esempio 2
Conteggio dei files presenti in una cartella.
La ricerca è fatta sfruttando l'OUTPUT del comando 'dir', in pratica acquisisce il numero antecedente la stringa "File(s)". Dare un'occhiata qui: stackoverflow.com

for /f %%A in ('dir ^| find "File(s)"') do set cnt=%%A
echo File count = %cnt%

Variabili

Si usa il comando SET, di default sono tutte stringe altrimenti si userà in aggiunta l'opzione /A per indicare che la variabile conterrà un numero naturale.

echo off
cls
SET rootPath=\\NomeHost\f$\6Backup\Digitalk_MaintenancePlan
SET fileFilter=\*.bak
SET fullPattern=%rootPath%%fileFilter%
ECHO %fullPattern%
 
SET /A numero1=123
SET /A numero2=977
SET /A numTot=%numero1% + %numero2%
ECHO %numTot%

Produrrà:

\\NomeHost\f$\6Backup\Digitalk_MaintenancePlan\*.bak
1100

C:\> _
Comparazione

Semplicemente si anticipa che:

  • la comparazione di variabili numeriche (definite con /A ) si valutano con gli operatori: EQU, NEQ, LSS, LEQ, GTR, GEQ.
  • l'operatore di comparazione == è usato solo nella valutazione tra stringhe.

Dare occhiata qui: [ss64.com]
Usare " nella valutazione di stringhe. Es.:

IF "ab" == "a b" Echo OK
IF "ab" NEQ "a b" Echo OK
IF NOT "ab" == "a b"

Comparazione di numeri:

Correct numeric comparison:
IF 2 GEQ 15 echo "Numero più grande"

Valutazione se una variabile è vuota:

IF [%1] == [] ECHO Valore assente
:: oppure:
IF [%1] EQU [] ECHO Valore assente

Valutazione se una variabile è NULL:

IF NOT DEFINED _esempio ECHO Valore assente
Di Sistema

Ci sono variabili chiamate di Sistema in quanto sono sempre disponibili da Command Prompt, ad esempio la variabile Path che contiene l'elenco CSV (il separatore è ';') dei percorsi resi "disponibili", con relativo contenuto di programmi applicativi.
Per visualizzarne il contenuto basta digitare Path. Per aggiungere un percorso a quanto già esistente ecco uno script:

@echo off 
%windir%\system32\cmd.exe /K set path=C:\SW\Tools\CA_GitCSrv;%path%

Queste variabili sono disponibili per esser editate da apposita finestra raggiungibile dal pannello di controllo:

System variables.png
Anomalie

A volte il contenuto di una variabile non è quella che ci si aspetta e magari "sembra" avere un valore precedente.
Il contenuto di una variabile è stampabile col comando echo che useremo per verificarne il contenuto, ed in alcuni casi ci sbalordirà il risultato!
Ecco un esempio per cui si conta quante volte una stringa è in un file XML:

set /A fileCountRemoteStart=0
for /F %%x in ('find /C "<filename value=""%winSCPLogLstFilePath%"') do (
	set fileCountRemoteStart=%%x
)
set /A fileCountRemoteStart=fileCountRemoteStart-2
echo Nr files remoti trovati: %fileCountRemoteStart%

Indipendentemente dal contenuto di alcune variabili concentriamoci sul ciclo per cui la variabile "fileCountRemoteStart" conterrà un numero che non si aggiornerà in output ma rimmarrà incredibilmente a ZERO, il valore iniziale impostato prima del ciclo.
Questa anomalia dipende dal modo con cui lavora l'interprete che NORMALMENTE non si aggiorna subito ma con un ritardo, per eliminare questo si usa far precedere lo script dal comando:

setlocal enabledelayedexpansion

Oppure si elude lanciando un comando con cmd, come segue per esempio:

set /A fileCountRemoteStart=0
for /F %%x in ('find /C "<filename value=""%winSCPLogLstFilePath%"') do (
	set fileCountRemoteStart=%%x
)
set /A fileCountRemoteStart=fileCountRemoteStart-2
cmd /v /c"echo Nr files remoti trovati: !fileCountRemoteStart!

Argomenti di input a batch file

Ecco come passare argomenti a script da CommandLine.
Sono ottenuti dalla linea comando e trattati nello script riferendosi ad essi con la percentuale seguita da un numero progressivo.
Esempio se in uno script avessimo 3 parametri il seguente ne stamperebbe in output il contenuto:

@echo off 
echo %1 
echo %2 
echo %3
Esempio, parametro opzionale

Esmpio su come acquisire un parametro opzionale in input, script "Src_ParamIn.bat":

@echo off
set driverVerifica=C:\
 
if (%1)==() (
    echo Nessun parametro in input, stting default: %driverVerifica%
    goto elaborazione
)
echo Parametro in input: %1 
set driverVerifica=%1
 
:elaborazione
echo Drive di indagine:
echo %driverVerifica%
 
:fine
echo fine...

Che ad esempio può esser eseguito come nei due seguenti casi, il primo senza alcun parametro di input ed il secondo mediante un parametro stringa:

Es DOS input params01.png

Commenti

REM Metodo 1 per commentare

:: Metodo 2 per commentare

Ridirezione output

L'esecuzione di uno script che produce dell'output, destinato alla console quindi la finestra display, si può convogliare ad esempio verso un file o anche la stamante, il carattere da usare è la parentesi angolare > ad esempio:

C:\> MioScript.bat > FileDiTesto.txt

Ma l'output può essere anche quello di un eseguibile, in questo caso bisogna fare attenzione se l'output è conseguente ad un errore perché in questo caso può esser necessario aggiungere un numero di codice alla aprentesi angolare, ad esempio '2>':

C:\> MioEseguibile_ConErrore.exe 2> FileDiTesto.txt

Il numero 1 (usato così: '1>') ridireziona l'output normale.
Per accodare testo ad un file già esistente si usa la doppia parentesi angolare '>>':

C:\> MioScript.bat >> FileDiTesto.txt

Si può fare anche il contrario ovvero inviare del testo ad un eseguibile o ad uno script con la parentesi angolare opposta:

C:\> MioScript.bat < SequenzaComandi.txt

Comandi utili

Timeout

In uno script si può inserire il comando timeout che consente l'attesa di n secondi prima di proseguire, è possibile anche svincolare l'esecuzione mediante la pressione di un qualsiasi tasto da tastiera.
Nel seguente esempio si usa una variabile che conterrà il nr di secondi di attesa e l'esecuzione è all'interno di un ciclo consizionato alla presenza o meno di un errore, è stato copiato interamente dall'help del software utility WinSCP:

@echo off
SET tries=3
SET triesSecInterval=100
:retry
 
winscp.com /script=MioFileSFTP_Script.txt
 
if %ERRORLEVEL% neq 0 (
    SET /A tries=%tries%-1
    if %tries% gtr 1 (
        echo SFTP fallito si ritenta tra %triesSecInterval% secondi...
        timeout /t %triesSecInterval%
        goto retry
    ) else (
        echo SFTP definitivamente fallito
        exit /b 1
    )
)
 
echo SFTP riuscito
exit /b 0
HostName

Per avere il nome del computer su cui si è basta lanciare il comando hostname:

C:\> hostname
ENIACK_PC
C:\> _

Tuttavia hostname è un comando ma se si vuole elaborare il suo contenuto stringa si può usare direttamente la variabile di sistema %COMPUTERNAME%

@echo off
SET nomePC=%COMPUTERNAME%
echo nome di questo computer: %nomePC%

Uno script di esempio per fare cose in funzione dell'hostname:

@echo off
cls
SET nomePC=%COMPUTERNAME%
echo nome di questo computer: %nomePC%
 
IF %nomePC%==DESKTOP-46L8Q2N (
    echo sviluppo
) ELSE (
    echo produzione
)

Da command Prompt o finestra terminale DOS ecco un elenco di Tips sul come fare per

GoTo

Il seguente esegue un loop infinito

@echo off
:Ciclo
 
telnet 10.10.10.10 5969
 
goto Ciclo

Chiamare un Bat da un Bat

Esempio di come chiamare uno script batch da un altro per molularizzare le funzioni.
Si suppongono 2 file batch, _uno.bat e _due.bat, _uno chimerà _due mediante il comando CALL.
Ecco cosa conterrà _uno.bat:

@echo off
del UnifiedCollector.exe.config
del UnifiedCollector.vshost.exe
del UnifiedCollector.vshost.exe.config
 
@echo Chiamata pulizia da DLL non modificate
Call _due.bat
 
pause

Ecco cosa conterrà _due.bat:

del Opc.Ua.Core.dll
del OpcLabs.BaseLibForms.dll
del OpcLabs.EasyOpcUAInternal.dll
del OpcLabs.EasyOpcUAInternal.xml
 
@echo fine pulizia DLL non modificate

ATTENZIONE se lo script principale è eseguito dal Task Scheduler di Windows OCCORRERA' impostare la "Working directory" altrimenti tutte le call NON funzioneranno!

ERRORLEVEL

Il seguente è copiato da: [ss64.com]

Ci sono due differenti metodi che valutano errorlevel:

  1. la prima sintasssi ( IF ERRORLEVEL ... ) fornisce compatibilità con l'antichità dei batch files da Windows 95.
  2. Il secondo metodo è usare la variabile %ERRORLEVEL% presente da Windows 2000 in sù.
IF ERRORLEVEL n statements should be read as IF Errorlevel >= number
i.e.
IF ERRORLEVEL 0 will return TRUE whether the errorlevel is 0, 1 or 5 or 64
IF ERRORLEVEL 1 will return TRUE whether the errorlevel is 1 or 5 or 64
IF NOT ERRORLEVEL 1 means if ERRORLEVEL is less than 1 (Zero or negative).
This is not very readable or user friendly and does not easily account for negative error numbers.

Using the %ERRORLEVEL% variable is a more logical method of checking Errorlevels:

IF %ERRORLEVEL% NEQ 0 Echo An error was found
IF %ERRORLEVEL% EQU 0 Echo No error found

IF %ERRORLEVEL% EQU 0 (Echo No error found) ELSE (Echo An error was found)
IF %ERRORLEVEL% EQU 0 Echo No error found || Echo An error was found

This allows you to trap errors that can be negative numbers, you can also test for specific errors:
IF %ERRORLEVEL% EQU 64 ...

To deliberately raise an ERRORLEVEL in a batch script use the EXIT /B command.

It is possible (though not a good idea) to create a string variable called %ERRORLEVEL% (user variable) if present such a variable will override and prevent the system variable %ERRORLEVEL% from being read by commands such as ECHO and IF.

Elaborazione stringhe

Estrazione sottoStringa

Come nella sostituzione di stringhe il comando è "strano" perché in una forma codificata e compatta: %variable:~daPosizione,nrCaratteri%, le cui sottoparti hanno il seguente significato:

  • data la variabile stringa, "variabile", preceduta da % e il cui nome finisce prima di :
  • ~ precede il numero corrispondente alla posizione in stringa di partenza su cui iniziare l'estrazione, numero che finisce con la presenza della virgola ,
  • infine tra ',' e '%' c'è il numero di caratteri da estrarre dalla posizione indicata al punto precedente.

Esempio:

:: Se ad esempio ora sono le 10:47:50.02 (output del comando "time"):
echo %time:~3,2%
:: Restuirà 47 ovvero la sottostringa che costituisce i minuti dell'orario attuale
:: dopo aver preso 2 caratteri dalla posizione 3 della stringa di partenza

Sostituzione

Data una variabile di tipo stringa si suppone si voglia sostituire una atottostringa con un altra oppure rimuoverla definitivamente.
Il comando da dare è un po' strano...: %variable:str1=str2%
In pratica è diviso in tre parti:

  • %variable: indica la varaibile "variable" sulla quale effettuare la sostituzione. Notare il '%' all'inizio del nome variabile e la delimitazione del ':'.
  • :str1= indica la variabile stringa "str1" da cercare e sostituire
  • =str2% indica la variabile stringa "str2" che sostituirà il contenuto corrispondente a "str1".

Esempio:

SET ricetta=Pompdori, cipolla, aglio, pepe, salsiccia.
SET nuovaRicetta=%ricetta:aglio=origano%
echo %nuovaRicetta%
:: Che produrrà l'output:
::      Pompdori, cipolla, origano, pepe, salsiccia.
::
:: oppure, per rimuovere del testo:
SET ricetta=Pompdori, cipolla, aglio, pepe, salsiccia.
SET nuovaRicetta=%ricetta:aglio, =%
echo %nuovaRicetta%
:: Che produrrà l'output:
::      Pompdori, cipolla, pepe, salsiccia.

Conteggio

Si usa il comando Find, col parametro /C, che però non restituisce un numero ma una stringa di descrizione da ripulire eventualemnte:

find /C "Aino Giuseppe" "FileDeleComparse.txt"
:: che restituisce ad es:
::      ---------- FileDeleComparse.txt: 3

Per non avere la stringa descrittiva si frappone il carattere <:

find /C "Aino Giuseppe" < "FileDeleComparse.txt"
:: che restituisce ad es:
::      3

Per catturare il contenuto del conteggio ed inserirlo in una variabile:

@echo off
SET winSCPLogLstFilePath=D:\Work\Digitalk\Backup_Sarah2_Scripts\Pacchetto_1.05\Sarah2_RemoteList.xml
 
SET /A nrFilesUploaded=0
for /F %%n in ('find /C "<filename value=" ^< "%winSCPLogLstFilePath%"') do (
    SET nrFilesUploaded=%%n
)
:: Si eliminano 2 files
SET /A nrFilesUploaded=nrFilesUploaded-2
 
echo Nr files effettivamente caricati: %nrFilesUploaded%

Find

Esegue la ricerca di una stringa in un file di testo ma con le seguenti limitazioni:

  • esegue ricerche esatte e in modalità case sensitive.
  • nn consente l'uso di espressioni regolari.
  • consente una ricerca in un singolo file.
  • non consente la restituzione del numero di linea corrispondente alla ricerca positiva.

Esempio:

@echo off
set search_string=bananas
set file_path=data.txt
 
FIND "%search_string%" "%file_path%"
if %errorlevel% equ 0 (
    echo Found %search_string% in %file_path%
) else (
    echo %search_string% not found in %file_path%
)

Findstr

Doc Microsoft findsr.
Nel seguente esempio data una stringa pattern da ricercare (usando findstr), si cerca in un determinato file e se trovata la stringa verrà inviata una e-mail mediante il tool Blat altrimenti tutto ok e si prosegue; è un estratto da uno script esistente:

:: ANALISI Errore tipo 1 (come da DOC ufficiale):
SET strOwlMsgError="Script: Exit code: 1"
findstr /c:%strOwlMsgError% %winSCPLogFilePath% > nul
if %ERRORLEVEL% equ 0 (
    echo Trovato indizio di errore %strOwlMsgError% nel file di log upload SFTP
    %blatEmailClientPath% -bodyF %emailBodyLogError4SFTP% -attach %winSCPLogFilePath% -tf %emailDL_4Sarah2Error% -sf %emailSubjectError4SFTP% %emailSMTPName_Par% %emailPassword_Par% %emailUserName_Par% 
    SET is2sendEmailOK=0
    SET isErrorOnLogFile=1
    goto endParseError
) else (
    echo 1 di 4 - Nessun errore %strOwlMsgError% nel file di log upload SFTP
)

Tips, varie soluzioni

Variabile stringa con data_orario

Segue uno script per generare una variabile stringa che può esser usata come suffisso a nomi files (es per archiviazioni). Copiato da [stackoverflow]

@echo off
cls
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%
 
set year=%date:~-4%
echo year=%year%
::---
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%
 
set strDateTime=%year%%month%%day%_%hour%%min%%secs%
 
echo strDateTime=%strDateTime%

FileSystem

Copia

Doc microsoft

Copia cartella e sottocartelle

Es.:

x>xcopy C:\cartellaOrigine C:\cartellaDestinazione /S /E

Comando XCopy

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
                           [/EXCLUDE:file1[+file2][+file3]...]

  source       Specifies the file(s) to copy.
  destination  Specifies the location and/or name of new files.
  /A           Copies only files with the archive attribute set,
               doesn't change the attribute.
  /M           Copies only files with the archive attribute set,
               turns off the archive attribute.
  /D:m-d-y     Copies files changed on or after the specified date.
               If no date is given, copies only those files whose
               source time is newer than the destination time.
  /EXCLUDE:file1[+file2][+file3]...
               Specifies a list of files containing strings.  When any of the
               strings match any part of the absolute path of the file to be
               copied, that file will be excluded from being copied.  For
               example, specifying a string like \obj\ or .obj will exclude
               all files underneath the directory obj or all files with the
               .obj extension respectively.
  /P           Prompts you before creating each destination file.
  /S           Copies directories and subdirectories except empty ones.
  /E           Copies directories and subdirectories, including empty ones.
               Same as /S /E. May be used to modify /T.
  /V           Verifies each new file.
  /W           Prompts you to press a key before copying.
  /C           Continues copying even if errors occur.
  /I           If destination does not exist and copying more than one file,
               assumes that destination must be a directory.
  /Q           Does not display file names while copying.
  /F           Displays full source and destination file names while copying.
  /L           Displays files that would be copied.
  /H           Copies hidden and system files also.
  /R           Overwrites read-only files.
  /T           Creates directory structure, but does not copy files. Does not
               include empty directories or subdirectories. /T /E includes
               empty directories and subdirectories.
  /U           Copies only files that already exist in destination.
  /K           Copies attributes. Normal Xcopy will reset read-only attributes.
  /N           Copies using the generated short names.
  /O           Copies file ownership and ACL information.
  /X           Copies file audit settings (implies /O).
  /Y           Suppresses prompting to confirm you want to overwrite an
               existing destination file.
  /-Y          Causes prompting to confirm you want to overwrite an
               existing destination file.
  /Z           Copies networked files in restartable mode.

The switch /Y may be preset in the COPYCMD environment variable.
This may be overridden with /-Y on the command line.
Copia con caratteri speciali nel nome

La copia di file che hanno i seguenti caratteri nel nome fallirà a meno di usare caratteri di escape per codificarli:
< > ( ) & | , ; "
tali caratteri dovranno essere preceduti dal simbolo ^
Es.:
per copiare il file You&Me.txt dal prompt comandi di DOS:

C:\>copy "D:\Mia Cartella\You^&Me.txt" D:\CartellaDestinazione

Move, spostamento

Attualmente è un comando "interno" non lo è sempre stato. Seguono esempi d'uso:

c:\move c:\windows\temp\*.* c:\temp
 
C:\move stats.doc, morestats.doc c:\statistics

Sintassi:

To move one or more files:
MOVE [/Y | /-Y] [drive:][path]file name1[,...] destination

To rename a directory:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2

[drive:][path]file name1	Specifies the location and name of the file or files you want to move.
destination	                Specifies the new location of the file. Destination can consist of a drive letter and colon, a directory name, or a combination. If you are moving only one file, you can also include a file name if you want to rename the file when you move it.
[drive:][path]dirname1	        Specifies the directory you want to rename.
dirname2	Specifies the new name of the directory.

/Y	Suppresses prompting to confirm you want to overwrite an existing destination file.
/-Y	Causes prompting to confirm you want to overwrite an existing destination file.

The switch /Y may be present in the COPYCMD environment variable. This switch may be overridden with /-Y on the command line. Default is to prompt on overwrites unless MOVE command is being executed from within a batch script.

Accodare più file in uno

Supponendo di avere in una sola cartella tutti i file, in formato ASCII, da copiare, accodandoli, Aprire una finestra terminale, e scrivere il seguente:

x>Copy *.* ContieneTutto.txt

Una applicazione pratica di questo procedimento può essere per copiare l'elenco di contatti dalla rubrica del cellulare in un unico file, per alternative leggere il supporto di Google. Si può trasferire via bluetooth da cellulare al PC l'intera rubrica questo produrrà un elenco di file vcf (VCards), il risultato è quello di avere n files dove n è il numero di contatti ottenuti.Come riunire in un unico file questo elenco? La risposta è nell'uso del comando indicato prima.

Cancellazione

Uso del comando Delete o brevemente Del

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

Significato ed uso dei parametri:

/P	Prompts for confirmation before deleting each file.
/F	Force deleting of read-only files.
/S	Delete specified files from all subdirectories.
/Q	Quiet mode, do not ask if ok to delete on global wildcard
/A	Selects files to delete based on attributes
attributes	R Read-only files S System files H Hidden files A Files ready for archiving - Prefix meaning not

Cancellazione di file senza errore se non esiste!

C:\) if exist c:\folder\file.ext del c:\folder\file.ext

Stessa tecnica usata su una cartella:

C:\) if exist c:\folder\

NOTA il '\' finale obbligatorio.

Verifica se un file esiste

if exist <insert file name here> (
    rem file exists
) else (
    rem file doesn't exist
)

Compressione di files o cartelle

Usando eseguibile
ZIP

In un batch file si userà un eseguibile che comprimerà la cartella\e in un univo file.
Nell'esempio seguente si userà "pkzip25.exe" (versione shareware autore PKWARE Inc.) reperibile da codesto sito pkzip
Il seguente script cancella (Del) il precedente file zip (Archivio.zip) se esistente (Exist), comprime nel file e apre l'explorer nella cartella di lavoro:

REM Spostamento cartella di lavoro
CD C:\Cartella da cui comprimere file o cartelle contenute

REM cancellazione precedente file
if exist "C:\Cartella da cui comprimere file o cartelle contenute\Archivio.zip" 
  DEL "C:\Cartella da cui comprimere file o cartelle contenute\Archivio.zip"

REM zip all files to transfer
pkzip25 -add -dir=relative "C:\Cartella da cui comprimere file o cartelle contenute\Archivio.zip"
"C:\Cartella da cui comprimere file o cartelle contenute\Dir con files\*"
 
explorer C:\Cartella da cui comprimere file o cartelle contenute
 
:END
PAUSE

Mentre per decomprimere ecco l'esempio:

@echo off
cls
 
echo .
rem ---------------------- ESTRAZIONE ---------------
echo ESTRAZIONE
 
rd C:\Deploy\Temp\Dir_destinazione\ /S/Q 
md C:\Deploy\Temp\Archivio
copy C:\Deploy\Repository\Archivio.zip C:\Deploy\Temp\Archivio\
cd C:\Deploy\Temp\Archivio\
C:\Deploy\Batches\pkzip25.exe -extr -dir Archivio.zip *
del Archivio.zip
 
:END
echo .
echo FINE
 
explorer C:\Deploy\Temp\MwSynchro
 
PAUSE
Installare pkzip25.exe

Un modo per rendere sempre disponibile il compressore è di installarlo con la seguente guida (anche come disinstallarlo).

  • Da una finestra terminale (eseguendo cmd) digitare
 regsvr32 PKZIP25.EXE

premere Enter

  1. Quindi per installarlo: scrivere: regsvr32 PKZIP25.EXE
  2. Per disinstallarlo: regsvr32 -u PKZIP25.EXE
7ZIP

Basta installare 7Zip che è un software openSource e che funziona benissimo con Windows 10 (a differenza dello ZIP citato prima che ora inizia ad avere problemi si "sicurezza").
7Zip è una Desktop Application ma nella cartella di installazione c'è un eseguibile che si può usare da linea comando ed è leggerissimo 460K, si chiama 7z.exe. La sintassi è simile a quella illustrata nello ZIP

 
Impostare una cartella come compressa

Istruzioni prese da articolo technet
Le cartelle o i file così impostati manterranno l'estensione naturale ma saranno memorizzate sul FileSystem in formato compresso.

Sintassi:

compact [{/c|/u}] [/s[:dir]] [/a] [/i] [/f] [/q] [FileName[...]]

Esempio, compressione di una data directory:

compact /c/s:percorsoDirectory nomeFilecompresso

CONTARE i files in cartelle

Il conteggio dovrà avvenire includendo le sottocartelle (subdirectory) e dovrà essere indipendentemente dalla lingua. Indipendente dalla lingua in quanto si una il FIND e questo comando effettua ricerche in testo

@echo off
cls
SET Count=0
SET dirPath="D:\Documenti\Fox_Australia\Dev\FOX.Dashboard.Apac"
@echo File count of:
@echo.%dirPath%
 
SET cmd="DIR %dirPath% /A-D /B /S | FIND /C /V """
 
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET Count=%%i
 
@ECHO.Il numero e'  %Count%
 
if %Count% lss 10 (
@echo[
@echo Error! Operation abort, script exit.
@echo[
goto :End_script
@
) else (
@echo[
@echo ok
@echo[
)
 
 
@echo[
@echo We do something ....
@echo[
 
:End_script

File più recente in cartella

Segue un esempio per ottenere il file più recente in una cartella:

echo off
for /f %%i in ('dir "\\Backup\DB\RS Bkp\SRC_Projects_IT_FromFile\*.bak" /b/a-d/od/t:c') do set LAST=%%i
echo The most recently created file is %LAST%

Retention - cancellare files vecchi

Il seguente script cancellerà i files xlsx più vecchi di 60 giorni

ForFiles /p "D:\Tmp\RetentionPolicy" /s /m *.xlsx /d -60 /c "cmd /c del /q @file"

Rinominazione

Aggiungere prefisso a piu files

Occorre impostare un ciclo su ogni file contato prima dell'esecuzione dello script, si userà quindi il comando FOR con l'uso di una varabile %A:

> for %a in (*.*) do ren "%a" "201307_LagoSegrino_%a"

Aggiungerà il prefisso "201307_LagoSegrino_" a tutti i files nella cartella dove si lancierà il comando. Da stackoverflow.com

Path

Se in una sessione di Command Prompt si vuole aggiungere un percorso a quelli predefiniti si digita:

set path=C:\MioNuovoPercorso;%path%

La variabile di sistema è "path" per cui oltre ai percorso esistenti si aggiunge il nuovo C:\MioNuovoPercorso il carattere ; è un separatore.

Capienza disco

Per ottenere lo spazio libero di un determinato drive si può usare il comando WMIC (Windows Management Instrumentation).
Ad esempio per avere un testo verificabile in uno script batch:

wmic volume where (DriveLetter='C:') get freespace /format:list

Che produce il seguente output:

C:\>wmic volume where (DriveLetter='C:') get freespace /format:list
FreeSpace=882523402240
C:\>_

Nell'esempio, il numero 882523402240 corrisponde a 820 GBytes ovvero 880.751.833.088 bytes
Un esempio con più informazioni (capacità, nome drive e spazio libero nel formato chiave=valore):

wmic volume where (DriveLetter='C:') get Caption, Capacity, freespace /format:list

NOTA per Microsoft WMIC è ormai deprecato da Windows 10.

Es verifica minimo spazio libero

Definito un driver da verificare, es. C:\, ed un limite minimo in KByte il seguente script riporta se è stato superato il limite minimo di occupazione.

::Istruzioni per un uso estensivo dei comandi
@setlocal enableextensions enabledelayedexpansion
@echo off
:: wmic volume where (DriveLetter='C:') get freespace /format:list
cls
set driverVerifica=C:\
set intBytesFree=0
set intKBytesFree=0
set intReservedSpaceKbyte=780742506
set intKByteValue=1024
 
echo Verifica spazio sul driver %driverVerifica% ...
for /f "tokens=3" %%a in ('dir %driverVerifica%') do (
    set strBytesFree=%%a
)
set strBytesFree=%strBytesFree:,=%
echo Spazio disponibile in Byte: %strBytesFree%
::Estrae tutto tranne gli ultimi 3 caratteri:
set strBytesFree="%strBytesFree:~0,-3%"
echo Spazio disponibile in KByte %strBytesFree%
set /a intKBytesFree=%strBytesFree%
 
echo .
echo Spazio KByte libero totale:  %intKBytesFree% KBytes
echo Spazio KByte soglia minima: %intReservedSpaceKbyte% KBytes
echo .
 
if %intKBytesFree% lss %intReservedSpaceKbyte% (
    echo __--' Spazio limite esaurito !!! '--__
    echo Spazio disponibile %intKBytesFree% MINORE DI %intReservedSpaceKbyte% (soglia minima)
) else (
    echo __--' Spazio sufficiente '--__
    echo Spazio disponibile %intKBytesFree% MAGGIORE DI %intReservedSpaceKbyte% (soglia minima)
)
::Si rilasciano tutte le variabili locali
endlocal

Spazio cartella

Per ottenere lo spazio occupato dai files in una determinata cartella per eventuali altre elaborazioni (copiato da heelpbook.net):

@echo off
cls
SET testPath=D:\Work\Digitalk\Backup_Sarah2_Scripts\Pacchetto_1.05\*.*
echo Estrapolazione spazio in %testPath%
::----------------
@For /F "tokens=*" %%a IN ('"dir %testPath% /-c | find "bytes" | find /v "free""') do @Set summaryout=%%a
::@Echo %summaryout%
@For /f "tokens=1,2 delims=)" %%a in ("%summaryout%") do @set filesout=%%a&set sizeout=%%b
::@Echo %filesout%
::@Echo %sizeout%
@Set sizeout=%sizeout:bytes=%
::@Echo %sizeout%
@Set sizeout=%sizeout: =%
@Echo Dimensione: %sizeout%

Aprire Esplora risorse

Per aprire Esplora risorse su una cartella specifica:

x>Explorer "D:\Mia cartella"

Aprire Internet Explorer su pagina specifica

Per aprire Esplora risorse su una cartella specifica:

@echo Apertura url voluto..
start "C:\Program Files\Internet Explorer" IEXPLORE.EXE http://aino.it/Downloads/KT/Release_

Esecuzione come Utente

Come Amministratore

Crea un file di testo e riversaci il contenuto:

del %temp%\sudo.tmp.vbs
@echo Set objShell = CreateObject("Shell.Application") > %temp%\sudo.tmp.vbs
@echo args = Right("%*", (Len("%*") - Len("%1"))) >> %temp%\sudo.tmp.vbs
@echo objShell.ShellExecute "%1", args, "", "runas" >> %temp%\sudo.tmp.vbs
@cscript %temp%\sudo.tmp.vbs
  1. Salvalo come SUDO.cmd
  2. Copia il file script di prima nella cartella C:\Windows\System32
  3. Ora per eseguire un programma con i privilegi di amministratore digita:
sudo cmd /k javaw.exe JAVA file

cmd /k Esegue il comando specificato nella stringa e rimane

Utente specifico

Da una finestra di Prompt DOS, digitare

runas /noprofile /user:UtenteUNO cmd

Al posto di UtenteUno si può usare anche Administrator.
Dopo aver digitato la password associata all'utente si aprirà una nuova finestra terminale e qualsiasi cosa si faccia la si farà come l'utente specificato.
Si può usare una utenza locale alla macchina oppure di dominio. Segue esempio:

Prompt run as other user.png

BitLocker

Ecco come sbloccare 2 driver che sono protetti da BitLocker, poi RI-avviare Explorer e RI-avviare SQL Server e SQL Server Agent:

manage-bde -unlock D: -password
manage-bde -unlock F: -password
taskkill /im explorer.exe /f
start explorer.exe
net stop mssqlserver /y
net start mssqlserver
net stop SQLSERVERAGENT /y
net start SQLSERVERAGENT

Lo script che sarà un classico file .bat dovrà essere eseguito in modalità amministratore.
I comandi net stop sono seguiti da /y allo scopo di non chiedere conferma all'utente dello stop del servizio.

Varie

  • Visualizzare l'utente corrente:
whoami

che può produrre ad es:

  • dominio\UserName_UtenteSistemaOperativo
  • nt service\mssqlserver

Esecuzione da Task Scheduler

E' possibile schedulare una esecuzione di uno script esso verrà eseguito come una applicazione.

Task Scheduler script exec 01.png

NOTARE:

  • se lo script ne chiama altri mediante CALL è OBBLIGATORIO inserire anche la Working directory che sarà quella dove saranno reperibili gli script chiamati mediante Call.
  • l'esecuzione dello script potrà produrre output su file basta usare il campo "Arguments" e ridirezionare l'otput con '>', ad es.: > C:\PercorsoLog\nomeFileLog.log

Power Shell

Guida interna: PowerShell

Mappa e Link

Windows 7


C#


Keys: Command Prompt