Newsgroup: it.comp.os.dos
Titolo: batch che ne scelga un altro da una lista di batch

Ciao a tutti, e' la prima volta dopo tanti anni che torno sul NG e vorrei
porre qualche domanda. Ecco la prima: ho una cartella dove ho inserito molti
batch. Vorrei sapere la sintassi da scrivere in un batch esterno alla
cartella che permetta di sceglierne uno e lanciarlo. Lavoro con WINXP
Professional.

 cartella che permetta di sceglierne uno e lanciarlo.
Con il comando
dir [unità:percorso_catella_batch]\*.bat /a-d /b /odne|find /v /n ""|more
(dove, al posto di [unità:percorso_cartella_dei_batch], metterai appunto l'unità e il percorso della tua cartella dei batch]) ti apparirà un elenco numerato dei batch presenti ordinati per data (e, in subordine, per nome e estensione).
A questo punto, vai di CHOICE (del quale ti riporto l'help qui sotto) e associ ad ogni numero l'operazione che lancia il batch corrispondente.
Ciao!
Charlie
--
» Assistenza PC a distanza «
http://aiutopc.shorturl.com
----------------------------------------------------------------------------
                                   CHOICE
Viene utilizzato in un file batch per visualizzare l'input dell'utente.
Tramite CHOICE è possibile visualizzare un prompt specifico, impostare
un'interruzione per la scelta di tasti raggruppati in un set e restituire un
parametro ERRORLEVEL al programma batch.
Per maggiori informazioni sul parametro ERRORLEVEL, vedere <CHOICE--Nota> ed
il comando <IF>.
Sintassi
    CHOICE [/C[:]tasti] [/N] [/S] [/T[:]c,nn] [testo]
Parametri
testo
    Specifica il testo che verrà visualizzato prima del prompt. Le
    virgolette sono necessarie soltanto se si desidera includere un
    carattere di opzione (/) come parte del testo. Se non viene specificato
    alcun testo, CHOICE visualizzerà soltanto il prompt.
Opzioni
/C[:]tasti
    Specifica i tasti disponibili nel prompt. Se vengono visualizzati, i
    tasti appariranno separati dalla virgola, racchiusi tra le parentesi
    quadre ([]) e seguiti da un punto interrogativo. Se non viene
    specificata l'opzione /C, CHOICE utilizzerà Y/N come valore predefinito.
    I due punti (:) sono facoltativi.
/N
    Non consente al comando CHOICE di visualizzare il prompt. Il testo prima
    del prompt verrà tuttavia visualizzato. Impostando l'opzione /N, i tasti
    specificati sono ancora validi.
/S
    Fa in modo che CHOICE distingua le lettere maiuscole dalle lettere
    minuscole. Se l'opzione /S non viene specificata, CHOICE accetta sia le
    lettere minuscole che maiuscole per ogni tasto specificato dall'utente.
/T[:]nn,c
    Sospende l'esecuzione per un numero di secondi specificato prima che
    venga effettuata la scelta di un tasto predefinito da parte del comando
    CHOICE. I valori per l'opzione /T sono i seguenti:
    c
        Specifica il carattere predefinito da usare dopo un numero nn di
        secondi. Il carattere deve essere compreso in un set specificato
        nell'opzione /C.
    nn
        Specifica il numero di secondi della pausa. I valori validi sono
        compresi tra 0 e 99. Il valore 0 indica che non verrà effettuata
        alcuna pausa.
                                CHOICE--Nota
Parametri ERRORLEVEL
Il primo tasto assegnato restituisce il valore 1, il secondo il valore 2, il
terzo il valore 3 e così via. Se l'utente preme un tasto non assegnato,
CHOICE emette un segnale acustico (vale a dire, invia un carattere BEL o 07h
alla console).
Se CHOICE rileva una condizione di errore, restituisce un valore ERRORLEVEL
uguale a 255. Se viene premuto CTRL+BREAK, o CTRL+C CHOICE restituisce un
valore ERRORLEVEL uguale a 0.
Quando si utilizzano dei parametri ERRORLEVEL in un programma batch,
effettuare un elenco seguendo un ordine decrescente.
----------------------------------------------------------------------------

 cartella che permetta di sceglierne uno e lanciarlo.
Con il comando
dir [unità:percorso_catella_batch]\*.bat /a-d /b /odne|find /v /n ""|more
(dove, al posto di [unità:percorso_cartella_dei_batch], metterai appunto l'unità e il percorso della tua cartella dei batch]) ti apparirà un elenco numerato dei batch presenti ordinati per data (e, in subordine, per nome e estensione).
A questo punto, vai di CHOICE (del quale ti riporto l'help qui sotto) e associ ad ogni numero il comando che lancia il batch corrispondente.


 Professional.
Eccoti, tra le righe tratteggiate, l'ossatura del batch che ti serve:
--------------------------------------------------------------------------
@echo off
dir [unità:percorso_cartella_batch\]*.bat /a-d /b /odne|find /v /n ""|more
set /p batch_no=Inserire il numero del batch da eseguire e battere Invio: 
if "%batch_no%"=="1" [unità:percorso_cartella_batch\]<nome_batch_1>
if "%batch_no%"=="2" [unità:percorso_cartella_batch\]<nome_batch_2>
if "%batch_no%"=="3" [unità:percorso_cartella_batch\]<nome_batch_3>
(eccetera)
--------------------------------------------------------------------------
Naturalmente, al posto di [unità:percorso_cartella_batch], metterai appunto l'unità e il percorso della tua cartella dei batch. Ricordati anche che alla fine della terza riga (dopo Invio:) c'è uno spazio (puramente estetico, peraltro). Infine, occhio a non cambiare data/ora dei batch della cartella perché altrimenti dovrai ritoccare anche questo batch, visto che la numerazione è basata appunto su data/ora.


 Professional.
Eccoti, tra le righe tratteggiate, l'ossatura del batch che ti serve:
--------------------------------------------------------------------------
@echo off
dir [unità:percorso_cartella_batch\]*.bat /a-d /b /odne|find /v /n ""|more
set /p batch_no=Inserire il numero del batch da eseguire e battere Invio:
if "%batch_no%"=="1" [unità:percorso_cartella_batch\]<nome_batch_1>
if "%batch_no%"=="2" [unità:percorso_cartella_batch\]<nome_batch_2>
if "%batch_no%"=="3" [unità:percorso_cartella_batch\]<nome_batch_3>
(eccetera)
--------------------------------------------------------------------------
Naturalmente, al posto di [unità:percorso_cartella_batch], metterai appunto
l'unità e il percorso della tua cartella dei batch.
A questo proposito volevo dirti che ho scovato un Autoexec.bat in WinXP (era
un file nascosto, e vuoto) e ho provato ad inserire un comando PATH con il
percorso della cartella dove risiedono i batch. La cosa funziona esattamente
come nel vecchio DOS (cosa te lo dico a fare!!), per cui mi chiedevo se sia
indispensabile aggiungere il percorso della cartella all'interno del batch
che scriverò. Sicuramente non costituirebbe un errore di esecuzione e te lo
chiedo più per curiosità che per altro. Inoltre mi piacerebbe avere qualche
spiegazione relativa alle singole righe. Ad esempio nella seconda riga c'e'
| prima di find quale ruolo svolge? La | prima di more la conosco e mi
sembra che serva a stampare a video il listato dei batch una pagina alla
volta, probabilmente anche la prima | ha lo stesso valore.
Poi nelle successive righe,  [ if "%batch_no%"=="1" ] tradotto in linguaggio
umano cosa significa? Mi pare che l'espressione prima del doppio segno di
uguale assegni il nome del batch al parametro (?) 1. E' così? Non capisco
però  [ _no]  e il ruolo che giocano i segni di % e perchè tutto è racchiuso
tra apici doppi. Spero di non abusare della tua disponibilità.
Ciao!
Febo.

 tra apici doppi.
E' la sintassi che si usa comunemente nei batch per il confronto tra
stringhe.
Ciao !


 dall'utente) fosse 1.
Sì, più o meno. Espandere una variabile immagino significhi che la variabile
non è elaborata attraverso il proprio nome bensì attraverso il proprio
contenuto. Ma è un'idea come un'altra...:-)
_____________________________________
Ho apportato alcune modifiche al batch e mi pare che funzioni però domani a
mente più fresca farò ulteriori controlli.
Invece che ordinare la lista dei batch per data e ora l'ho ordinata per nome
leggendo l'help del comando DIR. L'ho fatto soprattutto nel tentativo di
evitare di rimettere mano alla sintassi del batch esterno in caso di
modifiche a qualche batch della lista. Dunque, ho sostiuito /a-d /b /odne
con /A:/B /O:/N/P. Poi ho provato ad apportare modifiche a qualche batch
della lista e a salvarlo in modo che cambiasse l'ora e mi sembra che il
batch esterno continui a funzionare. In ogni caso consigli e suggerimenti
sono sempre ben accettati.
Grazie di nuovo.
Febo

 batch esterno continui a funzionare.
Ordinando i file per nome, sicuramente!
Ciao!


Ripensandoci, il fatto di dover aggiornare il batch tutte le volte che cambia il contenuto della cartella è veramente scomodo. Quindi, direi, butta via tutto e usa quest'altro batch (ma non chiedermi di commentartelo! :-):
-----------------------------------------------------------------------------------
@echo off
dir [unità:percorso_cartella_batch\]*.bat /a-d /b /odne|find /v /n "">%temp%\batlst
more<%temp%\batlst
echo.
set /p batno=Inserire il numero del batch da eseguire e battere Invio: 
type %temp%\batlst|find "[%batno%]">%temp%\batsel
set /p batsel=<%temp%\batsel
set batname=%batsel:*]=%
start [unità:percorso_cartella_batch\]%batname%
del %temp%\batlst
del %temp%\batsel
set batno=
set batsel=
set batname=
-----------------------------------------------------------------------------------
In questo, puoi impostare come preferisci l'ordinamento dei file (modificando l'opzione /odne nella seconda riga) e, soprattutto, funziona anche aggiungendo, togliendo o modificando i batch della cartella (almeno lo spero! :-).


 a FIND; a suddividerlo in paginate ci pensa già il MORE finale.
Questo invece non e' stato un errore di sintassi bensì di concetto. Ti
ringrazio della correzione.
________________________________________________________________________
Durante l'uso del batch che gestisce la lista dei batch mi sono trovato di
fronte un ulteriore problema. Quando scelgo un numero e lancio il batch
corrispondente tutto funziona bene se il batch che va in esecuzione non
contiene parametri. Se devo passargli un parametro in input con questo
metodo non lo posso fare e sono costretto a scrivere la sintassi completa al
prompt dei comandi. Il doskey mi risparmia un po' di lavoro ma la praticità
di
un codice ben scritto non avrebbe paragoni!!
Ad esempio, xml_token.bat contiene tra l'altro  [ perl
asciiNS-unicodeUTF-8.pl %1.txt > XML_%1.txt ] e ovviamente non posso pensare
che esegua correttamente il proprio lavoro senza dargli il parametro di cui
ha bisogno. E' possibile risolvere il problema aggiungendo della sintassi al
batch in modo da scrivere il nome del file txt che deve processare prima
dell'esecuzione del bacth, oppure mi devo rassegnare a scriverlo al prompt e
a cancellarlo ogni volta che analizzo un nuovo file txt?
Ne faccio un centinaio al giorno, puoi capire il motivo per cui te lo
chiedo.....
Senza considerare il caso di un batch che invece di un parametro ne contenga
due!!!
Ciao!
Febo.

 ha scritto nel messaggio
news:LzWRa.15133$sj6.3...@tornado.fastwebnet.it...
Ripensandoci, il fatto di dover aggiornare il batch tutte le volte che
cambia il contenuto della cartella č veramente scomodo. Quindi, direi, butta
via tutto e usa quest'altro batch (ma non chiedermi di commentartelo! :-):
_________
Oh nooooo! Il mio batch fonte di tanto lavoro buttato nel cestino :-))))))
A parte gli scherzi ti ringrazio veramente! Stasera lo provo, sempre che non
mi ci aggrovigli, ma prometto che non chiederņ spiegazioni. :-)
Tra l'altro ti ho posto un'ulteriore domanda sul post seguente senza aver
visto questo, sono appena entrato in rete.
Ciao!!
Febo

 dell'esecuzione del bacth
Il nuovo "lanciabatch" ti accetta tutti i parametri che vuoi: basta digitarli, separati da spazi, dopo il numero del batch al quale vanno passati (input di "Inserire il numero del batch da eseguire e battere Invio: ").


Ti disturbo un'ultima volta
Il batch mi dà errore. La prima riga è l'input, anche se tolgo l'estensione
txt mi restituisce lo stesso msg. La seconda è il msg del prompt.
1) Inserire il numero del batch da eseguire e battere Invio: 25 prova.txt
2) Impossibile trovare il file C:\Didattica\Batch\Batch-miei\*]=.
Nel batch ho modificato l'ordinamento e inserito il path della cartella dove
risiedono i batch.
Per sicurezza posto tutto il file:
@echo off
cls
dir C:\Didattica\Batch\Batch-miei\*.bat /a-d /b /on|find /v /n
"">%temp%\batlst
more<%temp%\batlst
echo.
set /p batno=Inserire il numero del batch da eseguire e battere Invio:
type %temp%\batlst|find "[%batno%]">%temp%\batsel
set /p batsel=<%temp%\batsel
set batname=%batsel:*]=%
start C:\Didattica\Batch\Batch-miei\%batname%
del %temp%\batlst
del %temp%\batsel
set batno=
set batsel=
set batname=
------------------------------------------------------------------
In ogni caso ti ringrazio davvero per tutte le informazioni che mi hai dato!
Ciao!
Febo

 2) Impossibile trovare il file C:\Didattica\Batch\Batch-miei\*]=.
Ohi, hai proprio deciso di farmi sgobbare, eh?! ;-)
In effetti, il batch, contrariamente a quanto ti avevo detto ieri, non si sogna nemmeno di gestire i parametri. Quindi... butta via di nuovo tutto e usa quest'altro, che dovrebbe proprio non solo passare i parametri, ma anche gestire correttamente eventuali batch aventi nomi che contengono spazi:
----------------------------------------------------------------------------------
@echo off
dir D:\Didattica\Batch\Batch-miei\*.bat /a-d /b /odne|find /v /n "">%temp%\batlst
echo.
more<%temp%\batlst
echo.
echo Inserire numero ed eventuali parametri del batch da eseguire e battere Invio:
set /p batin=
set batpar=%batin:* =%
echo %batpar%>%temp%\batpar
echo set /a batparl=%%~z1-1>%temp%\batparl.bat
call %temp%\batparl.bat %temp%\batpar
echo set batno=%%batin:~0,-%batparl%%%>%temp%\batno.bat
call %temp%\batno.bat
type %temp%\batlst|find "[%batno%]">%temp%\batsel
if errorlevel 1 goto error
set /p batsel=<%temp%\batsel
set batname=%batsel:*]=%
start "" "D:\Didattica\Batch\Batch-miei\%batname%" %batpar%
goto end
:error
echo.
echo Input non valido!
:end
del %temp%\batlst
del %temp%\batpar
del %temp%\batparl.bat
del %temp%\batno.bat
del %temp%\batsel
set batin=
set batpar=
set batparl=
set batno=
set batsel=
set batname=
----------------------------------------------------------------------------------
Ciao!
Charlie
--
» Assistenza PC a distanza «
http://aiutopc.shorturl.com
P.S. Questa volta, non c'è nessuno spazio occulto a fine riga, nemmeno dopo "Invio:".

Sai che ti dico? E' la maledizione del primo Elenco.bat che è stato così
brutalmente sbattuto nel cestino dopo tanto lavoro da parte mia  :-)
Non funziona nemmeno quest'ultimo! Mi sono limitato a cambiare la lettera
all'unita di destinazione, da D a C , e ho ordinato al solito i batch per
nome. Per il resto mi restituisce sempre il msg "input non valido". Mi pare
di averti spremuto abbastanza e non persevererò ulteriormente. Tengo il
prezioso e primo Elencobatch.bat che mi hai fornito e in seguito cercherò il
modo di fargli accettare anche i parametri. Per adesso non posso pretendere
di più. Ti ringrazio di nuovo per tutta l'attenzione e la disponibilità che
hai messo in questo thread e ti porterò come esempio ai miei studenti per il
corretto spirito da adottare in Rete, in particolare sui NG.
Un saluto riconoscente.
Febo


ti serve un programmino in basic, crei il collegamento sul desktop
ed esegui tutti i .bat da menu.
bye
-- 
http://members.xoom.virgilio.it/_XOOM/eldoradocity/index.htm
Nulla è più pericoloso di un'idea, quando è l'unica che abbiamo.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

 Per il resto mi restituisce sempre il msg "input non valido".
Adagio!!! "Input non valido!" non lo dice il sistema operativo, ma è un
messaggio che ho inserito IO nel batch (tanto per metterci un minimo di
gestione degli errori) e che salta fuori qualora l'utente inserisca come
primo elemento dell'input qualcosa che non è un numero corrispondente a un
batch esistente (ad esempio X, oppure 32 quando i batch sono meno di 32).
Quindi, mi riporteresti un esempio di input che dai al superbatch e che
provoca "Input non valido!"?
Ciao e fai sapere!


 ti porterò come esempio ai miei studenti
Grazie, sei molto gentile! Anzi, già che ci siamo, comunicagli anche
l'indirizzo della mia pagina!!! ;-)))
Ciao e fai sapere!


 l'indirizzo della mia pagina!!! ;-)))
Questo va da sè!
Ciao!
Febo

 successiva inferiore
Sì, l'ho riposizionato io così perché mi sembrava più chiaro in caso di input lunghi.
Ciao!


OK funziona benissimo!
Vorrei chiederti se posso inserire più di un parametro e come mi devo
comportare nel caso i parametri contengano spazi.
Ormai, visto che ci siamo.......
Ciao!
Febo

 comportare nel caso i parametri contengano spazi.
Sì, certo, puoi inserire tutti i parametri che vuoi, esattamente nella forma in cui li passeresti al batch chiamato dal superbatch se lo lanciassi direttamente.
Ciao!
Charlie
--
» Assistenza PC a distanza «
http://aiutopc.shorturl.com
----------------------------------------------------------------------------------
@echo off
dir D:\Didattica\Batch\Batch-miei\*.bat /a-d /b /odne|find /v /n "">%temp%\batlst
echo.
more<%temp%\batlst
echo.
echo Inserire numero ed eventuali parametri del batch da eseguire e battere Invio:
setlocal enabledelayedexpansion
set /p batin=
echo set batno=%%1>%temp%\batin.bat
call %temp%\batin.bat %batin%
set batpar=!batin:*%batno%=!
findstr "^\[%batno%]" %temp%\batlst>%temp%\batsel
if errorlevel 1 goto error
set /p batsel=<%temp%\batsel
set batname=%batsel:*]=%
start "%batname%" "D:\Didattica\Batch\Batch-miei\%batname%" %batpar%


 Sì, certo, puoi inserire tutti i parametri che vuoi, esattamente nella forma in cui li
passeresti al batch chiamato dal superbatch se lo lanciassi direttamente.
C'è qualche problema con i parametri che contengono spazi, senza spazi funziona
bene........ esattamente come il precedente superbatch   ;-)
Dunque, lancio il superbatch e digito: 25 "prova uno" dove 25 è il numero corrispondente al
batch da eseguire e "prova uno" rappresenta il file prova uno.txt. La medesima sintassi
(comprese virgolette e spazi) dal prompt dei comandi dà esito positivo mentre dal superbatch il
msg restituito è il seguente (copy/paste) : [
"C:\Didattica\Batch\Batch-miei\xml_token.bat"   "prova" non è riconosciuto come comando interno
o esterno, un programma eseguibile o un file batch.]
xml_token.bat è stato così costruito:
------------------------------------------------------------------------------------------
@echo off
CD\Corpus Montale\Lavoro\Conteggio-token
perl asciiNS-unicodeUTF-8.pl %1.txt > XML_%1.txt
move XML_%1.txt "C:\Corpus Montale\Lavoro\Poesie pronte per MC"
perl 
apostrofo_spazio.pl
 %1.txt > apostrofo_spaziato_%1.txt
------------------------------------------------------------------------------------------
Il batch è supertestato e funziona. Può darsi che abbia bisogno di ritocchi se lanciato dal
superbatch?
Se invece al prompt del superbatch metto l'estensione al parametro cioè scrivo 25 "prova
uno".txt il msg di ritorno é: [ input non valido ], senza che si apra la seconda finestra dei
comandi.
Se scrivo 25 "prova uno.txt" il msg è: [ "C:\Didattica\Batch\Batch-miei\xml_token.bat" "prova"
non è riconosciuto come comando interno o esterno, un programma eseguibile o un file batch.],
cioè il medesimo di prima. Naturalmente le parentesi quadrate sono state aggiunte da me.
Ciao!
Febo.

 bene........ esattamente come il precedente superbatch   ;-)
Il problema non sono gli spazi, ma le virgolette, che vengono elaborate dall'interprete dei comandi della famiglia NT in un modo più intricato del codice civile (quello italiano :-). Infatti, se tu provi a dare
xml_token.bat "prova uno"
al prompt di Windows 9x, che ha un interprete dei comandi meno "rimaneggione", vedrai che ti darà errore.
Comunque, per tagliare la testa al toro e non costringerti cambiare le tue abitudini sintattiche, sai che cosa facciamo? Facciamo intervenire proprio l'interprete dei comandi di XP, il quale tratterà, ipso facto, la riga di comando come se fosse stata digitata al prompt. In pratica, si tratta solamente di sostituire, nel superbatch, la riga
start "%batname%" "C:\Didattica\Batch\Batch-miei\%batname%" %batpar%
con la riga
start "%batname%" cmd /k ""C:\Didattica\Batch\Batch-miei\%batname%"%batpar%"
Ciao e... al prossimo ritocco!


 Ciao e... al prossimo ritocco!
Direi alla prossima domanda, magari un po' meno macchinosa!
Ciao!!
Febo.