Newsgroup: it.comp.os.dos
Titolo: [lungo] batch + SED (lavorare usando le liste)

Anzitutto, mi auguro che ci sia ancora qualcuno che legge/scrive, visto che da
parecchio, questo gruppo, una volta fiorente, sembra un deserto dopo un
attacco atomico.
Scenario:
Ho una cartella sul server (linux) [M:\COMUNE\Archivio Macchine\] con
archiviate le macchine costruite nei svariati anni. Sono parecchie centinaia,
una cartella per macchina, con uno o piï¿œ livelli di sottocartelle.
Le macchine, negli anni sono state costruite usando diverse tecnologie
elettroniche (diverse marche di PLC e CN).
Ora, molte cartelle contengono anche dei files di documentazione, che sono la
stampa in ascii del software, altrimenti compilato dal PLC o dal CN, che
richiederebbero, in caso di consultazione, per assistenza ai clienti od altro,
la copia della cartella nel mio PC della scrivania (con WINDOWS XP), e l'avvio
dello specifico programma (dipende da marca a marca) e che non permette la
visione completa di tutto il software, ma di solo un blocco alla volta e rende
faticosa la ricerca.
L'uso invece di una stampa ASCII di tutto il software su un file ASCII,
permette di navigare assai velocemente ed avere una visione globale migliore .
Ora, per mia comoditï¿œ, ho bisogno di sapere quali cartelle hanno questa
documentazione, e in quali manca, in modo da provvedere.
Dato le diverse tecnologie elettroniche usate, ho pensato di applicare una
ricerca alla volta per ogni tipo di tecnologia.
Per tutto questo ambaradan, mi appoggio alle features del porting in dos del
programma, originario in ambiente *nix, SED.
Primo caso:  (che funziona a meraviglia)
Tutte le cartelle del primo tipo di tecnologia in esame, contengono, come file
unico di identificazione, il file PLCE34.KEY.
Il file contenente la documentazione, ï¿œ un file in testo puro, con
estensione .DOC, non necessariamente con lo stesso nome della cartella in cui
ï¿œ contenuto...
Creo sul mio PC un file contenente tutte l'elenco di tutte le cartelle
contenenti il file chiave:
cd M:\COMUNE\Archivio Macchine\
dir /b /s M:PLCE34.KEY > c:9034-1
cd C:
Il file 9034-1 contiene una cosa del tipo:
M:\COMUNE\Archivio Macchine\3375\3375.plc\PLCE34.KEY
M:\COMUNE\Archivio Macchine\3240-3243\3240-3243-mod2.plc\PLCE34.KEY
M:\COMUNE\Archivio Macchine\3240-3243\3240-3243-mod1.plc\PLCE34.KEY
M:\COMUNE\Archivio Macchine\3301\3301.PLC\PLCE34.KEY
Ora mi creo un file (9034-3), ordinato per comoditï¿œ, contenente nella parte
terminale *.DOC al posto di PLCE34.KEY. Mi creo, per eventuale consultazione
future,un file (9034-2) contenente il solo path.
set FILE=PLCE34.KEY
type 9034-1 | sed "s/%FILE%//" > 9034-2
type 9034-1 | sed "s/%FILE%/*.DOC/" > temp
type temp | sort > 9034-3
del temp
set FILE=
Ora 9034-3 contiene di questa roba:
M:\COMUNE\Archivio Macchine\3246\plc\*.DOC
M:\COMUNE\Archivio Macchine\3257\plc\*.DOC
M:\COMUNE\Archivio Macchine\3258\PLC\*.DOC
M:\COMUNE\Archivio Macchine\3259\plc\*.DOC
M:\COMUNE\Archivio Macchine\3260\plc\*.DOC
M:\COMUNE\Archivio Macchine\3261\plc\*.DOC
A questo punto debbo fare un test se esite o manca un file con estensione .DOC
nella cartella, un qualcosa tipo:
IF EXIST M:\COMUNE\Archivio Macchine\3259\plc\*.DOC <azione>
per tutte le cartelle. SED, mi viene in aiuto, consentendomi di costruire un
file batch che lanciato, appoggiandosi ad un altro batch, di costruire 2
liste, una contenente le cartelle complete (9034-si) ed una quelle incomplete
(9034-no).
@echo off
cls
echo cancellazione files obsoleti
if exist 9034-si del 9034-si
if exist 9034-no del 9034-no
echo creazione file in corso...
echo @echo off > 3.bat
echo cls >> 3.bat
echo if exist 9034-si del 9034-si >> 3.bat
echo if exist 9034-no del 9034-no >> 3.bat
type 9034-3 | sed "s/^M.*/call 4.bat \x22&\x22/" >> 3.bat
echo.
echo File   3.BAT   creato!
Ora il batch 3.BAT creato contiene:
@echo off
cls
if exist 9034-si del 9034-si
if exist 9034-no del 9034-no
call 4.bat "M:\COMUNE\Archivio Macchine\3246\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3257\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3258\PLC\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3259\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3260\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3261\plc\*.DOC"
ed il batch di ausilio 4.BAT contiene:
@echo off
if exist %1 goto yes
if not exist %1 goto no
goto fine
:yes
dir /b /s %1 >> 9034-si
dir /b /s %1 | sed "s/\x22//g"
goto fine
:no
echo %1 | sed "s/\x22//g" | sed "s/*.DOC//" >> 9034-no
:fine
Il risultato ï¿œ:
9034-si (macchine con documentazione completa)
M:\COMUNE\Archivio Macchine\3207\3207.plc\PLC-D.DOC
M:\COMUNE\Archivio Macchine\3213\PLC.PLC\CINA.DOC
M:\COMUNE\Archivio Macchine\3214\PLC14.PLC\CINA.DOC
M:\COMUNE\Archivio Macchine\3215\PLC15.PLC\CINA.DOC
9034-no  (macchine con documentazione da fare)
M:\COMUNE\Archivio Macchine\3278\Plc\
M:\COMUNE\Archivio Macchine\3286\Plc\
M:\COMUNE\Archivio Macchine\3302\3302.plc\
M:\COMUNE\Archivio Macchine\3304\3304.plc\
M:\COMUNE\Archivio Macchine\3306\3306.plc\
--------------------------------------------------------
Ora passiamo alle macchine con il secondo tipo di tecnologia, e che, seguendo
la traccia di cui sopra, non riesco a fare funzionare.
Il file di firma del tipo di tecnologia, ï¿œ un file con nomi vari, ma con
estensione .XPJ e la documentaxione, sempre su un file ascii, ï¿œ un file con
estensione .DOC in alcuni casi ed il altri un file SENZA estensione.
Partiamo, supponendo che il file di documentazione sia di tipo .DOC!
Creo la solita lista iniziale:
cd M:\COMUNE\Archivio Macchine\
dir /b /s M:*.XPJ > c:9034-1
cd C:
Il file 9034-1 contiene una cosa del tipo:
M:\COMUNE\Archivio Macchine\temp\3526_PLC.MCH\3526.XPJ
M:\COMUNE\Archivio Macchine\3386\SACC_PLC.MCH\3386.XPJ
M:\COMUNE\Archivio Macchine\3386\SACCA_CN.MCH\STAMPA.XPJ
creo un file 9034-3 con le seguenti istruzioni:
set FILE=*.XPJ
echo Creazione files...
type 9034-1 | sed -e "s/%FILE%/*.DOC/" > temp
type temp | sort > 9034-3
del temp
set FILE=
... ma il risultato non va.
Debbo trovare il modo di cancellare il nome del file, lasciando il solo path ed
aggiungere alla fine il *.DOC, oppure *. nel caso di files senza estensione.
Debbo quindi riuscire a troncare il nome del file dal path.
... E quï¿œ chiedo l'aiuto ...
P.S. asterisco e punto, sono espansi nella riga di comando del programma SED,
come <tutti i caratteri>...
For my real address use the X-SPAM header
-- 
+---------------------------------------------------------------------------+
|        Velocita' e alcool uccidono. Fatti una pera che e' meglio.         |
|                                                                           |
+-----#11--------------------Campagna contro le pubblicita` idiote.---------+

 ... E quí chiedo l'aiuto ...
Prova a passare a SED la seguente espressione regolare:
s/\\[^\]*$/:DOC/
Ciao

 Prova a passare a SED la seguente espressione regolare: s/\\[^\]*$/:DOC/
Ho fatto un errore di digitazione, nella ER al posto del due punti il 
punto ovviamente...

> Prova a passare a SED la seguente espressione regolare: s/\\[^\]*$/:DOC/
Ok per il "2 punti" errato, corretto...
Ma non funzia, dice che il processo ha tentato di scrivere in una pipe
inesistente, e restituisce un file vuoto.
In finestra dos ho usato:
type 9034-1 | sed "s/\\[^\]*$/.DOC/" > 9034-3
Provato il comando anche sul pinguino, ma c'ï¿œ un errore.
cat 9034-1 | sed 's/\\[^\]*$/.DOC/'
mi stampa il file originario, con in fondo un ".DOC" sbagliato.
Corretta la tua stinga in:
cat 9034-1 | sed 's/\\[^\]*$/\\\*.DOC/'
e funziona.
Resta il fatto che il porting su dos che ho io, (chissï¿œ a quale versione di sed
si sono ispirati..) a quanto pare, non ï¿œ perfetto e non va come dovrebbe.
Cerco, sperando di trovarla, un'altra versione, spero migliore..
In pratica debbo trasformare:
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\PRG3294.XPJ
in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.DOC
ed in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.
P.S. Non ho ben capito la prima parte della stringa che mi hai dato il
   \[^\]*$
vorrebbe dire di trovare l'ultimo \ ?
For my real address use the X-SPAM header
-- 
+---------------------------------------------------------------------------+
|I puristi ritengono inopportuno utilizzare driver proprietari sutto Linux, |
|i masochisti amano utilizzare driver Windows sotto Linux... Twisted Evil   |
+-----#19--------------------Campagna contro le pubblicita` idiote.---------+

 vorrebbe dire di trovare l'ultimo \ ?
Certo, letteralmente dice di cercare una stringa che finisce con una \ e 
che prosegue con una serie di caratteri qualsiasi escluso proprio \
L'intera espressione quindi gli dice di sostituire tutto quello che c'è 
dall'ultima barra in poi che in fin dei conti è il nome del file con 
\*.DOC

 s/\[^\]*$/\*.DOC/
Funziona anche col SED in dos!
Solo che bisogna mettere anche tra le parentesi quadre, la doppia \\, ossia:
s/\\[^\\]*$/\\\*.DOC/
P.S. ero via per lavoro ed ho provato solo ieri sera...
Complimenti per il suggerimento.
For my real address use the X-SPAM header
-- 
+---------------------------------------------------------------------------+
|      Informazioni traffico  899 04 21 21                                  |
|                                                                           |
+-----#14--------------------Campagna contro le pubblicita` idiote.---------+

 Complimenti per il suggerimento.
Ciao, alla prossima.

 M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.
mi rendo conto che il post ï¿œ vecchio, ma...
prova a guardare l'help del comando FOR , da prompt dei comandi, da win2000 
in poi (quindi anche XP)
e la gestione delle variabili... ci sono un sacco di bei trucchettini :-)
davvero, non sto sparando a caso ;-))