Windows command line
Re: Windows command line
Why you would modify that line?
Re: Windows command line
because in your script was > Clipboard := ClipSavedmaybe modify this sClipSaved := ClipboardAll to ClipSaved := ClipboardAll
short for test , here I modified "Clipboard := ClipSaved" to "Clipboard := sClipSaved "
( because in original "sClipSaved := ClipboardAll" )
Code: Select all
sCommand:="dir&&ver"
aa1:=commandline(sCommand)
msgbox, 262208,CMD ,%aa1%, ;- DOS command result
;-
msgbox,%clipboard% ;- maybe here the saved clipboard before
return
CommandLine(sCommand)
{
Critical, ON
sClipSaved := ClipboardAll
RunWait, %Comspec% /C "(%sCommand%) 2>&1 |Clip",, Hide
sCommandOutput := Clipboard
Clipboard := sClipSaved
Return sCommandOutput
}
Re: Windows command line
Yes to change the var name is no a problem.
I saw the var name error I made, sorry.
I tested the function, but evidently I no tested it well, sorry.
I modified the function in this mode:
but if you prefer you can tell any variable like you prefer.
Thank you to show me that.
I saw the var name error I made, sorry.
I tested the function, but evidently I no tested it well, sorry.
I modified the function in this mode:
Code: Select all
/*
|==================================================================================================================================|
| |
| ESECUZIONE COMANDO DA COMMAND LINE |
| |
|==================================================================================================================================|
| |
| Esegue un comando da Command line e ne ritorna l'output di testo che genera, anche se è generato nello StandardError. |
| L'esecuzione è molto veloce perché utilizza il Clipboard per memorizzare il risultato, anziché utilizzare il classico metodo |
| della redirezione dell'output su file e la conseguente lettura di tale file e l'eliminazione; di contro esiste la possibilità |
| teorica ( anche se improbabile ) che, durante l'esecuzione di questo programma, il Clipboard venga modificato perché viene |
| acceduto da un altro processo. |
| Ritorna l'output generato dall'esecuzione del Comando, anche se tale output corrisponde ad un errore del Comando. |
| |
| SINTASSI: |
| CommandLine( sCommand ) |
| |
| ARGOMENTI: |
| sCommand : Stringa corrispondente alla linea di Comando da eseguire, secondo la sintassi da Linea di Comando. |
| |
| RITORNA: |
| Output di testo generato dall'esecuzione del Comando, anche se tale Output è generato nello StandardError a causa di un errore |
| del Comando. |
| |
|==================================================================================================================================|
*/
CommandLine( sCommand )
{
Critical, ON ; Specifico che questa Funzione deve essere eseguita nel più
; breve tempo possibile perché, poiché utilizza il clipboard,
; durante l'esecuzione di questa Funzione non deve essere
; modificato il contenuto del clipboard.
sClipSaved := ClipboardAll ; Memorizzo nella variabile sClipSaved l'intero contenuto del
; Clipboard, qualunque esso sia ( anche non testo ).
RunWait, %Comspec% /C "(%sCommand%) 2>&1 | Clip",, Hide ; Chiamo Cmd per eseguire il comando specificato nell'Argomento
; sCommand; redireziono StandardError su StandardInput , in
; modo da editare su StandardInput anche un eventuale errore
; che sarebbe visualizzato su StandarError; effettuo il pipe di
; StandarInput con il Clipboard in modo da memorizzare nel
; Clipboard tutto l'output appena generato.
sCommandOutput := Clipboard ; Leggo il contenuto del clipboard che contiene l'output di
; testo del comando appena eseguito.
Clipboard := sClipSaved ; Ripristino il contenuto del clipboard al valore originale.
Return sCommandOutput ; Ritorno l'output generato dal Comando eseguito.
} ; CommandLine( sCommand )
Thank you to show me that.
Re: Windows command line
@Archimede thank you for correction , don't want to confuse or change variable , only accordance
Code: Select all
sClipSaved := ClipboardAll
;...
Clipboard := sClipSaved
Re: Windows command line
This is a new version of the function:
The commented part is a suggest that other gives me: I tested it and it works well, but after I found another solution that I define "better" because that is shorter ( but I am no sure that is good: I tested it and seems good: if you tell the other solution is good is possible to delete all commented part ).
That function return the Standar output generated by the command line; the function returns the Standard Error in the argument var sStandardError and the ErrorLevel in the argument var iErrorLevel .
Sorry for Italian comments: that is because I wrote this function for me ( and I no know English very well... ).
Code: Select all
/*
|==================================================================================================================================|
| |
| ESECUZIONE COMANDO DA COMMAND LINE |
| |
|==================================================================================================================================|
| |
| Esecuzione comando da Command line e attesa termine del comando; ritorna lo Standard Output generato, lo Standard Error e |
| l'ErrorLevel nelle variabili di chiamata ( vedi più avanti ). |
| L'esecuzione è la pìù veloce possibile, testata tra diversi metodi di esecuzione ( per esempio anche tramite chiamata |
| ComObjCreate("WScript.Shell") seguito da .Exec oppure da .Run. |
| La redirezione su file è stata testata come decisamente più veloce rispetto al piping su Clip ( Command | Clip ), in particolare |
| se l'hardware è un HD SSD. |
| La redirezione, a differenza del piping, non modifica il valore di ErrorLevel che il Comando genera, e quindi se si desidera |
| viene ritornato. |
| Ritorna l'output generato dall'esecuzione del Comando, anche se tale output corrisponde ad un errore del Comando. |
| Eventuali caratteri speciali generati dall'output ( per esempio È ü ecc... ) verranno interpretati correttamente e ritornati |
| come originariamente generati dal comando e visualizzabili in ambiante di linea di comando ( cmd.exe ). |
| |
| SINTASSI: |
| CommandLine( sCommand[, sStandardError[, iErrorLevel]] ) |
| |
| ARGOMENTI: |
| sCommand : Stringa corrispondente alla linea di Comando da eseguire, secondo la sintassi da Linea di Comando. |
| L'esecuzione, internamente alla funzione, è compresa tra () in modo che possa essere definito anche un |
| comando multiplo ( per esempio Cammand1 & Command2 || Command3 ); non sono permesse redirezioni ( > ) e |
| nemmeno piping ( | ). |
| sStandardError : Opzionale - Se viene definito specifica il nome della variabile in cui al ritorno della funzione verrà |
| inserito il testo generato come Standard Error. |
| iErrorLevel : Opzionale - Se viene definito specifica il nome della variabile in cui al ritorno della funzione verrà |
| inserito il valore di ErrorLevel generato dall'esecuzione del Comando sCommand. |
| |
| RITORNA: |
| Output di testo generato nello Standard Output dall'esecuzione del Comando. |
| Se è dichiarata la variabile opzionale sStandardError, in tale variabile al ritorno verrà inserito il testo generato nello |
| Standard Error dall'esecuzione del Comando. |
| Se è dichiarata la variabile opzionale iErrorLevel, in tale variabile al ritorno verrà inserito il valore di ErrorLevel generato |
| dall'esecuzione del Comando. |
| |
|==================================================================================================================================|
*/
CommandLine( sCommand, ByRef sStandardError := "", ByRef iErrorLevel := 0 )
{
Static sStdOutFileName := A_Temp . "\StdOut.txt" ; Path completo del file temporaneo di testo in cui
; redirezionare lo Standard Output.
Static sStdErrorFileName := A_Temp . "\StdErr.txt" ; Path completo del file temporaneo di testo in cui
; redirezionare lo Standard Error.
Static sOEMCP := DllCall( "GetOEMCP", "UInt" ) ; Identificazione numero della CodePage attualmente settata nel
; sistema e memorizzazione numero di tale Codepage in sOEMCP.
RunWait, "%Comspec%" /D /Q /C (%sCommand%)>"%sStdOutFileName%"2>"%sStdErrorFileName%",, Hide UseErrorLevel
; Esecuzione Linea di comando tramite chiamata Cmd.exe:
; Argomenti di chiamata Cmd.exe:
; /D : Disabilita l'esecuzione di comandi di esecuzione
; automatica dal Registro di sistema;
; /Q : Disattiva echo;
; /C : Esegue il comando specificato dalla stringa, quindi
; termina.
; Esegue il Comando specificato nell'Argomento sCommand
; compreso tra (...) in modo che, se sCommand contiene più
; comandi in sequenza ( per esempio dir & set ) tali Comandi
; vengano eseguiti ed il successivo redirezionamento si
; riferisca ad entrambi.
; Standard Output: redirezionato su file definito da
; sStdOutFileName;
; Standard Error: redirezionato su file definito da
; sStdErrorFileName;
; ErrorLevel: poiché i redirezionamenti ( a differenza del
; piping | ) non modificano il valore di ErrorLevel generato
; dal ( o dai ) Comando(i), tale ErrorLevel fiene ritornato da
; Cmd.exe, viene letto da RunWait... UseErrorLevel e quindi
; copiato nella variabile di linguaggio ErrorLevel, che quindi
; alla fine conterrà l'ErrorLevel generato dal ( o dai )
; Comando(i) contenuto in sCommand.
iErrorLevel := ErrorLevel ; Il valore di ErrorLevel generato dal Comando e ritornato da
; Cmd.exe è assegnato alla variabile iErrorLevel, che è un
; Argomento di chiamata definito come ByRef, quindi sarà
; leggibile dal chiamante dopo la chiusura di questa funzione.
FileRead, sStandardOutput, *P%sOEMCP% %sStdOutFileName% ; Lettura file temporaneo di testo contenente lo Standard
; Output generato dal ( o dai ) Comando(i) redirezionato; copio
; in sStandardOutput il contenuto di tale file.
; I caratteri vengono decodificati utilizzando la Codepage di
; sistema definita dalla variabile sOEMCP, calcolata all'inizio.
FileDelete, %sStdOutFileName% ; Eliminazione file temporaneo di testo contenente lo Standard
; Output.
FileRead, sStandardError, *P%sOEMCP% %sStdErrorFileName% ; Lettura file temporaneo di testo contenente lo Standard Error
; generato dal ( o dai ) Comando(i) redirezionato; copio in
; sStandardError il contenuto di tale file.
; I caratteri vengono decodificati utilizzando la Codepage di
; sistema definita dalla variabile sOEMCP, calcolata all'inizio.
; Argomento di chiamata definito come ByRef, quindi sarà
; leggibile dal chiamante dopo la chiusura di questa funzione.
FileDelete, %sStdErrorFileName% ; Eliminazione file temporaneo di testo contenente lo Standard
; Error.
Return sStandardOutput ; Ritorno lo Standard output completo.
;~ If( A_IsUnicode )
;~ {
;~ VarSetCapacity( sOEMStdErr, StrPut( sStandardError, "CP0" ), 0 )
;~ ; Calcolo la lunghezza del buffer di memoria che deve contenere
;~ ; la stringa sStandardError quando viene convertita secondo
;~ ; System default ANSI Codepage; dimensiono il buffer di memoria
;~ ; alla dimensione calcolata ed assegno alla variabile sOEMstr
;~ ; l'indirizzo di tale buffer; ed effettuo l'inizializzazione
;~ ; con tutti i caratteri ASCII 0.
;~ StrPut( sStandardError, &sOEMStdErr, "CP0" ) ; Inserisco in memoria, all'indirizzo rappresentato da
;~ ; sOEMStdErr, la stringa contenuta in sStandardError e la
;~ ; converto secondo System default ANSI Codepage.
;~ VarSetCapacity( sOEMStdOut, StrPut( sStandardOutput, "CP0" ), 0 )
;~ ; Calcolo la lunghezza del buffer di memoria che deve contenere
;~ ; la stringa sStandardOutput quando viene convertita secondo
;~ ; System default ANSI Codepage; dimensiono il buffer di memoria
;~ ; alla dimensione calcolata ed assegno alla variabile
;~ ; sOEMStdOut l'indirizzo di tale buffer; ed effettuo
;~ ; l'inizializzazione con tutti i caratteri ASCII 0.
;~ StrPut( sStandardOutput, &sOEMStdOut, "CP0" ) ; Inserisco in memoria, all'indirizzo rappresentato da
;~ ; sOEMStdOut, la stringa contenuta in sStandardOutput e la
;~ ; converto secondo System default ANSI Codepage.
;~ } ; If( A_IsUnicode )
;~ sStandardError := StrGet( A_IsUnicode ? &sOEMStdErr : &sStandardError, sOEMCP )
;~ ; Leggo, converto e assegno la stringa sStandardError
;~ ; dall'inidirizzo:
;~ ; - se il sistema è Unicode, l'indirizzo è rappresentato da
;~ ; sOEMStdErr, che rappresenta la memoria in cui è stata
;~ ; inserita e convertita tale stringa;
;~ ; - altrimenti l'indirizzo è quello rappresentato da
;~ ; sStandardError che contiene la stringa stessa;
;~ ; al momento della lettura della memoria effettuo la
;~ ; conversione secondo la CodePage attualmente settata nel
;~ ; sistema, precedentemente identificata e memorizzata in
;~ ; sOEMCP.
;~ ; La stringa convertita e assegnata è nella variabile
;~ ; sStandardError, che è un Argomento di chiamata definito come
;~ ; ByRef, quindi sarà leggibile dal chiamante dopo la chiusura
;~ ; di questa funzione.
;~ Return StrGet( A_IsUnicode ? &sOEMStdOut : &sStandardOutput, sOEMCP )
;~ ; Leggo, converto e ritorno la stringa sStandardOutput
;~ ; dall'inidirizzo:
;~ ; - se il sistema è Unicode, l'indirizzo è rappresentato da
;~ ; sOEMStdOut, che rappresenta la memoria in cui è stata
;~ ; inserita e convertita tale stringa;
;~ ; - altrimenti l'indirizzo è quello rappresentato da
;~ ; sStandardOutput che contiene la stringa stessa;
;~ ; al momento della lettura della memoria effettuo la
;~ ; conversione secondo la CodePage attualmente settata nel
;~ ; sistema, precedentemente identificata e memorizzata in
;~ ; sOEMCP.
} ; CommandLine( Command, ByRef iErrorLevel := 0, ByRef sStandardError := "" )
That function return the Standar output generated by the command line; the function returns the Standard Error in the argument var sStandardError and the ErrorLevel in the argument var iErrorLevel .
Sorry for Italian comments: that is because I wrote this function for me ( and I no know English very well... ).