Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
  Condividi: Facebook Twitter
Windowes 11 + DOS: problemi con variabili su unica riga
#1
Su PC con Windows 11, ho notato che, in DOS, se impartisco varie volte di seguito la riga
Codice:
set /a N1=5 > nul 2>&1 & call echo N1=%N1% & call set /a N1=%N1%+%N1% > nul 2>&1 & call echo N1=%N1%
ottengo l'output corretto solo la prima volta, mentre la riga
Codice:
set /a N1=5 > nul 2>&1 & call echo N1=%N1% & call set /a N2=%N1%+%N1% > nul 2>&1 & call echo N2=%N2%
(in cui compare anche la variabile N2) impartita varie volte fornisce sempre l'output corretto.
Qualcuno può dirmi cosa c'è che non va nella prima riga?
Ringrazio sin d'ora chi mi aiuterà.
Cita messaggio
#2
Non so bene spiegarti il perchè, ma bisogna alla fine azzerare N1, cioè:

Codice:
set "N1=5" & call echo N1-1=%N1% & call set /a "N1=N1+N1" > nul 2>&1 & call echo N1-2=%N1% & set N1=

Ho messo alcune variazioni, vedi le varianti comprese tra doppi apici che non necessitano di % per il nome variabile

Con l'altra formula comprendente N2 non ci sono problemi

Ora però vò a cena, buona fine e buon principio 000019
Cita messaggio
#3
Ciao bobo 779256.
Grazie per aver risposto ma... a questo punto, tanto varrebbe sostituirla interamente con
Codice:
set /a N1=0
in effetti, io so perfettamente il motivo per cui questo inconveniente si verifica... speravo ci fosse un comando (tipo il comando CALL ma efficace anche quando il contenuto di una variabile viene impostato più di 2 volte nella stessa riga) che permettesse di evitare il verificarsi dell'inconveniente, ma forse il DOS non è stato concepito per contenere tanti comandi in un'unica riga...
Cita messaggio
#4
Citazione:...tanto varrebbe sostituirla interamente con... set /a N1=0
No, non è la stessa cosa e non funziona, set N1= elimina la variabile, set N1=0 la imposta a zero ma rimane
Se fai una prova in una nuova finestra del prompt dei comandi digitando queste istruzioni
[Immagine: screenshot-196.png]

vedi la differenza, nella stessa finestra dei comandi resta memorizzato N1 finchè non lo si annulla, set N visualizza tutte le variabili già impostate da S.O. e nella finestra del prompt attiva che iniziano per N
Citazione:...so perfettamente il motivo per cui questo inconveniente si verifica...

Se mi rinfreschi la memoria... non ricordo il perchè della cosa, anche perchè mettendo in un file batch ogni singolo comando non sulla stessa linea funziona perfettamente

Citazione:...speravo ci fosse un comando (tipo il comando CALL...

Che è la stessa cosa in pratica, aggiunto un comando per far funzionare la serie di istruzioni

Citazione:...forse il DOS non è stato concepito per contenere tanti comandi in un'unica riga...

Non in modo semplice

Personalmente avevo accantonato i file bat, ma è un periodo che ho bisogno di automatizzare ed eseguire alcuni specifici compiti, ed essendo digiuno completamente di altri tipi di linguaggi sono tornato ai batch, un minimo so come muovermi con essi e con qualche script VBS ma niente di più


Se posso permettermi, ma perchè vuoi usare i comandi su un'unica riga?


Questa è l'ultima versione della linea di codice precedente, ulteriore semplificazione sul comando nul, mi tornano in mente man mano che sperimento e vado avanti
Codice:
set "N1=5" & call echo N1-1=%N1% & call set /a "N1=N1+N1" >nul & call echo N1-2=%N1% & set N1=
Cita messaggio
#5
Ciao bobo 779256.
In se stessa, la riga da me postata ha come unica utilità il fatto che, per farla funzionare, occorre capire alcune cose sul funzionamento del DOS, ed il mio scopo non è visualizzare ciò che la suddetta riga visualizzerebbe se funzionasse secondo la mia logica, ma capire quale logica c'è dietro il funzionamento di uno script DOS nel caso specifico di istruzioni scritte sulla stessa riga.
Nel caso specifico, se io avessi scritto uno script dedicando una singola riga ad ogni singola istruzione della riga DOS per la quale ho aperto il post, otterrei che:
Codice:
set /a N1=5 > nul 2>&1 & REM La variabile numerica N1 ora contiene il numero 5
echo N1=%N1%            & REM Questa istruzione visualizzerebbe il contenuto della variabile N1 in questo preciso istante (5)
set /a N1=%N1%+%N1% > nul 2>&1 & REM Ora la variabile numerica N1 ora conterrebbe il doppio di quanto conteneva prima dell'esecuzione di questo comando
echo N1=%N1%            & REM Questa istruzione visualizzerebbe il contenuto della variabile N1 in questo preciso istante (10)
REM Alla fine dello script, la variabile N1 conterrebbe l'ultimo valore impostato, che in questo caso è 10
A rigore di logica, il comando
Codice:
set /a N1=5 > nul 2>&1 & call echo N1=%N1% & call set /a N1=%N1%+%N1% > nul 2>&1 & call echo N1=%N1%
dovrebbe fare la stessa cosa ma, poiché l'interprete DOS prima prende in considerazione la singola riga, poi trasforma ogni variabile contenuta nella singola riga nel suo contenuto, dopo di ché esegue la singola riga, infine passa alla riga successiva, ciò non avviene.
A questo punto, mi sono posto la domanda "Se volessi scrivere su un'unica riga i comandi DOS che qui ho riportato 'in cascata' in modo da ottenere il medesimo effetto, come dovrei fare?"
Ed ora sto cercando la risposta a quella domanda.
La tua risposta non mi va bene perché dopo l'esecuzione dei comandi 'in cascata' la variabile N1 conterrebbe 10, mentre dopo l'esecuzione della riga DOS da te proposta, la variabile N1 sarebbe vuota.
Preciso che la risposta alla mia domanda avrebbe come unico risultato di arricchire la mia cultura personale sull'argomento; per il futuro, potrebbe essere inutile, o potrebbe essere di importanza vitale... in altre parole: "impara l'arte e mettila da parte".
Cita messaggio


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)