Uscita DIR nell’array BAT?

C’è un modo per leggere l’output di un comando ‘dir’ in una matrice in un file BAT? O dovrei prima inviarlo a un file, poi leggere il file ed eliminare il file dopo?

Lo scopo è ottenere un elenco di cartelle in una directory, aggiungere un numero a ciascuna e quindi richiedere all’utente un input numerico per selezionare una cartella.

AGGIORNAMENTO: capito!

SETLOCAL EnableDelayedExpansion SET /A c=1 FOR /F "tokens=*" %%F in ('dir /on /b /a:d /p %svnLOCAL%') DO ( ECHO !c!. %%F SET dir_!c!=%%F SET /ac=c+1 ) REM test array ECHO !dir_4! ENDLOCAL 

Batch non supporta formalmente gli array, ma è ansible emulare gli array utilizzando le variabili di ambiente.

 @echo off setlocal enableDelayedExpansion ::build "array" of folders set folderCnt=0 for /f "eol=: delims=" %%F in ('dir /b /ad *') do ( set /a folderCnt+=1 set "folder!folderCnt!=%%F" ) ::print menu for /l %%N in (1 1 %folderCnt%) do echo %%N - !folder%%N! echo( :get selection set selection= set /p "selection=Enter a folder number: " echo you picked %selection% - !folder%selection%! 

Nel codice sopra, gli elementi “array” sono denominati folder1, folder2, folder3 …

Alcune persone usano invece nomi come cartella [1], cartella [2], cartella [3] … Sembra certamente più simile, ma è proprio per questo che non lo faccio. Le persone che non sanno molto sul batch vedono variabili del genere e suppongono che il batch supporti correttamente gli array.

La soluzione sopra non funzionerà correttamente se uno qualsiasi dei nomi delle cartelle contiene il ! carattere: il nome della cartella sarà danneggiato durante l’espansione della variabile %% F a causa dell’espansione ritardata. C’è una soluzione che comporta l’triggerszione e la distriggerszione dell’espansione ritardata, ma non vale la pena entrare a meno che non sia necessario.

Questa non è una risposta, ma un ampio commento come risposta alla risposta di dbenham.

Il mio punto di vista su questo argomento è esattamente l’opposto di quello di dbenhams. A mio avviso, nelle risposte agli argomenti di Batch dobbiamo essere molto concisi e chiari, in particolare con i principianti, e fornire le informazioni minime che aiutano a risolvere il problema, ma non per sommergere e rendere confuse le risposte. Esistono due modi per simulare gli array in Batch: tramite le parentesi quadre ampiamente utilizzate per racchiudere l’indice, oppure no, ma in entrambi i casi il concetto è lo stesso: selezionare un particolare elemento da un elenco di variabili con lo stesso nome tramite un indice numerico .

Se non vengono utilizzate parentesi quadre, un principiante non comprenderebbe il concetto di base; invece potrebbero pensare che il file Batch usasse uno “strano trucco” per risolvere il problema. Un programmatore esperto, d’altra parte, direbbe sicuramente: “Ehi, questo è un array, ma scritto in un modo diverso”. Non c’è modo di confondere questa caratteristica con un’altra cosa diversa, e non c’è motivo di mascherarla come altra cosa diversa.

Se vengono usate parentesi quadre, un principiante troverà tonnellate di informazioni sul concetto di “array” e molti esempi su questo argomento in molti linguaggi di programmazione, e persino descrizioni indipendenti da qualsiasi linguaggio di programmazione che, naturalmente, sono di uso immediato nei file Batch . L’uso di parentesi quadre in questo caso è molto più chiaro che non farlo. Tuttavia, alcune persone pensano che questi benefici non valgano la “confusione” nell’assumere che Batch “supporti formalmente gli array”.

Secondo me, il punto centrale di questa questione non è discutere se Batch supporta formalmente gli array o no, ma il fatto che qualsiasi persona possa utilizzare il concetto di array per manipolare i dati nei file batch. Non vedo alcun problema con la possibilità che alcune persone possano pensare che Batch supporti correttamente gli array, specialmente i principianti; la gestione dell’array è diversa nei diversi linguaggi di programmazione, quindi sarebbe sufficiente una spiegazione dei dettagli del batch. Tuttavia, se una discussione più formale su questo argomento sembrasse essere importante, vorrei aggiungere un esempio diverso.

Sai che il linguaggio di programmazione C NON “supporta formalmente” alcuna operazione di Input-Output? Quando Dennis Ritchie lo ha ideato, in particolare ha lasciato queste operazioni al di fuori del design del linguaggio per mantenere il compilatore piccolo e compatto. Questo significa che NON puoi leggere / scrivere alcun dato nei programmi C? Ovviamente no! Questo significa semplicemente che queste operazioni sono implementate al di fuori del compilatore tramite le librerie di funzioni, quindi se hai bisogno di sviluppare un compilatore C, non devi preoccuparti di come compilare PRINT, READ o qualsiasi altra istruzione I / O perché semplicemente non esiste in linguaggio C!

Interessante, non è vero?

Pertanto, se un principiante chiedesse: “Come scrivere un messaggio in linguaggio C?”, Pensi che la risposta corretta dovrebbe essere: “Non puoi. Il linguaggio C non supporta formalmente alcuna istruzione I / O, ma puoi emulare tali operazioni tramite le funzioni della libreria “? Ovviamente no! La maggior parte delle persone risponderebbe semplicemente descrivendo printf, ma praticamente nessuno ha menzionato che printf () NON fa parte del linguaggio C e penso che sia corretto. Nell’analisi finale, qual è il problema se qualcuno può pensare che il linguaggio C supporti le operazioni di I / O? Le persone possono utilizzare le operazioni di I / O nei programmi C indipendentemente dal modo in cui sono state implementate, giusto?

Bene, a mio modesto parere, lo stesso approccio dovrebbe essere usato nel caso degli array di Batch.

Forse un esempio più vicino è questo: ci sono molte domande sulle “operazioni aritmetiche in batch” e la risposta di solito è: “usa set /A comando set /A “. Non ho mai visto una risposta che indichi che “i file batch non supportano variabili numeriche, solo stringhe, ma le operazioni aritmetiche possono essere emulate in diversi modi, come il comando set /A “. Perché? Sembra che i puristi siano “più puristi” quando si soffermano sugli array di Batch, ma a loro non interessano altri argomenti, come i numeri. Davvero non capisco lo scopo del frequente chiarimento su “batch non supporta gli array”! SO rojo utente ha opinato su questo punto: “È un argomento pedante che non offre alcuna soluzione ai problemi che i richiedenti stanno cercando di risolvere” (vedi il suo commento completo sopra questa risposta ).

Antonio