Windows command line

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
Archimede
Posts: 503
Joined: 25 Nov 2021, 09:49
Location: Switzerland / Italy

Re: Windows command line

Post by Archimede » 23 Jan 2023, 05:15

Why you would modify that line?

garry
Posts: 3770
Joined: 22 Dec 2013, 12:50

Re: Windows command line

Post by garry » 23 Jan 2023, 06:22

maybe modify this sClipSaved := ClipboardAll to ClipSaved := ClipboardAll
because in your script was > Clipboard := ClipSaved

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
}

Archimede
Posts: 503
Joined: 25 Nov 2021, 09:49
Location: Switzerland / Italy

Re: Windows command line

Post by Archimede » 23 Jan 2023, 11:14

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:

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 )
but if you prefer you can tell any variable like you prefer.
Thank you to show me that.

garry
Posts: 3770
Joined: 22 Dec 2013, 12:50

Re: Windows command line

Post by garry » 23 Jan 2023, 11:31

@Archimede thank you for correction , don't want to confuse or change variable , only accordance

Code: Select all

sClipSaved     := ClipboardAll
;...
Clipboard      := sClipSaved

Archimede
Posts: 503
Joined: 25 Nov 2021, 09:49
Location: Switzerland / Italy

Re: Windows command line

Post by Archimede » 28 Jan 2023, 05:48

This is a new version of the function:

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 := "" )
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... ).

Post Reply

Return to “Ask for Help (v1)”