PDA

View Full Version : [BATCH] assegnare ad una variabile l'output di una riga di comando


23Andrea
11-07-2015, 19:49
Ciao.
Avrei bisogno di assegnare ad una variabile l'output della riga di comando
CERTUTIL -hashfile %1 | FINDSTR /v Hash | FINDSTR /v CertUtil
che restituisce l'hash SHA1 del file "trascinato" sull'icona del file batch.
C'è un sistema più semplice dell'inserire la riga di comando in un loop FOR /f ? :cry:
Grazie.

DavideDaSerra
14-07-2015, 23:31
Perché dovresti passare la linea di comando a un for /f?
Non puoi passare direttamente il primo parametro, visto che è l'unico che usi?

Comunque io vengo da bash, di cmd conosco davvero poco.

a te servirebbe quello he in bash è la command substitution

es
facendo

contenuto_cartella=$(ls)

echo $contenuto_cartella


ottengo in output


file1
file2
file3


in cmd non credo che si possa fare se non col for /f

23Andrea
15-07-2015, 20:00
Perché dovresti passare la linea di comando a un for /f?
Perchè, nella mia sconfinata ignoranza, non ho trovato un sistema migliore :muro:
Il senso della mia domanda è proprio questo: come si fa, in batch, a dire
"prendi l'output di questa riga e assegnalo alla variabile X" ?
:(

x_Master_x
16-07-2015, 08:37
Puoi usare un file temporaneo in alternativa al FOR

: x_Master_x
@ECHO OFF
ECHO MYCOMMAND > "%TEMP%\Temp.txt"
SET /P VARIABLE=<"%TEMP%\Temp.txt"
DEL "%TEMP%\Temp.txt"
ECHO %VARIABLE%
PAUSE

23Andrea
17-07-2015, 18:02
Si, ok, funziona :)
Però, anche questo, sa un po' di workaround.
Mi interessava capire se esiste un sistema "diretto" per assegnare ad una variabile il valore in uscita di una riga di comando, oppure se questo è uno dei (tanti) limiti di questo linguaggio di script.:mc:

x_Master_x
17-07-2015, 22:20
Non mi risulta nessun comando del genere altrimenti l'avrei scritto.

DavideDaSerra
28-08-2015, 20:02
A consumo dei posteri:


c'è l'operatore () che è simile al bash $()

cmd:

set var=(dir)
%var%


equivale a bash:
var=$(ls)
echo $var


NOTA: in powershell funziona anche
$var=(dir)
## oppure
$var = (dir)
echo $var
# oppure
$var

einstein1969
01-09-2015, 23:50
Non si puo'. Setta la variabile ma poi la perde...

prova da riga di comando:


echo pluto | (set/p "var=" && call echo %var%)


output:

C:\Users\ACER>echo pluto | (set/p "var=" && call echo %var%)
pluto


einstein1969

DavideDaSerra
02-09-2015, 13:12
non ho ben capito cosa volessi fare.
volevi assegnare 'pluto' a var o ho capito male?

l'operatore () (da quello che ho capito) restituisce sotto forma di stringa l'output del comando che ci metti dentro, tu dentro ci setti una variabile che (nella mia mentalità unix) è un'operazione eseguita da un processo 'figlio' che non ha variabili in comune col padre (se non quelle esportate), in windows non so se sia così ma mi sembra plausibile. Da le variabili sono interne al singolo processo e un processo figlio le eredita per copia, dunque quello che il figlio modifica resta modificato nel figlio.


io () lo leggo come 'esegui quello che hai dentro e caccia fuori il risultato come stringa'

edit:
ho googlato un po' e ho trovato che in windows non c'è l'equivalente dell'export in linux.
-> in windows il 'figlio' vede le variabili del padre ma le modifiche fatte dai figli non passano al padre. Devi passarle per forza con l'exit value, se puoi fare la return di un oggetto ok, altrimenti devi usare un oggetto condiviso (io userei un file)