Newsgroup: it.comp.os.win.xp
Titolo: Indicizzare un elenco di file

Buona sera a tutti.
 
Il mio problema è il seguente:
 
serie (lunga) di file video denominati come segue:
 
  580302 Abcdefg
1003010 Bcdeaf
1052012 Hskdv
 
eccetera.
 
Vorrei poterli indicizzare anche come:
 
Abcdefg      580302
Bcdeaf      1003010
Hskdv       1052012
 
Come fare, ammesso sia possibile?
 
Grazie a chiunque mi possa aiutare.
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

 Grazie a chiunque mi possa aiutare.
 
sai bene che esistono tanti programmi di renaming dei files, ma invece 
di perdere il tempo a scegliere quello giusto, io farei come segue, 
specialmente se di tali files hai già un elenco, per es. come file di 
testo:
fra la parte numerica e alfabetica dei nomi inserirei un punto e 
virgola come separatore, poi salverei questo elenco come file .CSV, lo 
aprirei con Excel, e lì invertirei le colonne numeri-lettere in 
lettere-numeri.
spero di essermi spiegato


Magari avessi un elenco come file di testo.
Uso normalmente File Renamer Ultra 2000 per rinominare file a gruppi, ma 
questa operazione non me la può fare, avendo i file stringhe variabili sia 
come numero che come testo.
Grazie comunque.
 
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

Nel suo scritto precedente, Giampaolo Natali ha sostenuto :

sfiga, ma io insisterei dicendo che se questo file di testo non ce 
l'hai te lo puoi creare
in finestra dos io farei DIR /S *.MP4 > ELENCO.TXT
POI
DIR /S *.MPG >> ELENCO.TXT
DIR /S *.TIPIVIDEO >> ELENCO.TXT
e poi farei quella operazione detta nel precedente messaggio, cioè in 
ELENCO.txt metterei un separatore tale che rinominando ELENCO.TXT in 
ELENCO.CSV si abbiano 2 colonne, una con la parte di nome numerica e 
l'altra alfabetica, qualunque sia la lunghezza delle parti numerica e 
alfabetica.
scambierei di posto la colonna numerica con l'alfabetica e ordinerei 
quella alfabetica.
Ne sono convinto.

Zipper ha detto questo mercoledì :

naturalmente il presupposto è avere un po' di dimestichezza col DOS

 Magari avessi un elenco come file di testo.
 
che ci vuole, copia quanto sotto  (tra INIZIO e FINE) in notepad,
salvalo come scanfiles.vbs e poi usalo come scritto nelle note che
trovi nei commenti, il file generato dovrebbe essere quello che ti
serve e può essere facilmente importato in excel o altro (usa il
formato delimitato da tabulazioni)
 
 
' ========================= INIZIO
Option Explicit
 
'
' da prompt comandi:
'
'
' cscript //nologo scanfiles.vbs x:\percorso
'
' al termine viene generato il file "filelist.txt"
' contenente l'elenco dei files all'interno del
' percorso specificato e di tutte le sottocartelle
' dello stesso
'
 
Const ForReading = 1, ForWriting = 2, ForAppending = 8
 
Const COL_SEP = "|"
Const OUT_LST = "filelist.txt"
 
Dim fso, arg
 
Set fso = CreateObject("Scripting.FileSystemObject")
Set arg = WScript.Arguments
WScript.Quit main(arg.Count, arg)
 
Function main(argc, argv)
  Dim sPath
  Dim dicFiles
 
  If argc <> 1 Then
    printf "uso: scanfiles percorso"
    printf "es.: scanfiles c:\temp"
    main = 1
    Exit Function
  End If
 
  sPath = argv(0)
  Set dicFiles = CreateList(sPath)
  If dicFiles.Count = 0 Then
    printf "Nessun file presente nel percorso " & sPath
    main = 2
    Exit Function
  End If
 
  SaveList dicFiles, OUT_LST
  main = 0
End Function
 
Sub printf(sTxt)
  WScript.StdOut.WriteLine sTxt
End Sub
 
Function CreateList(sPath)
  Dim dicFiles, lRet
  Dim aFiles, iFil
 
  Set dicFiles = CreateObject("Scripting.Dictionary")
  ScanFolder sPath, dicFiles
  Set CreateList = dicFiles  
End Function
 
Sub ScanFolder(sPath, dicFiles)
  Dim fld, sfd, fil
  Dim sBuff
 
  Set fld = fso.GetFolder(sPath)
  For Each fil In fld.Files
    sBuff = fil.ParentFolder & COL_SEP
    sBuff = sBuff & fil.Name & COL_SEP
    sBuff = sBuff & fil.Size & COL_SEP
    sBuff = sBuff & fil.DateLastModified
    dicfiles.Add dicfiles.Count, sBuff
  Next
  For Each sfd In fld.SubFolders
    ScanFolder sfd.Path, dicFiles
  Next  
End Sub
 
Sub SaveList(dicFiles, sFile)
  Dim fp, itm, vaCol
 
  Set fp = fso.OpenTextFile(sFile, ForWriting, True)
  For Each itm In dicfiles.Items
    vaCol = Split(itm, COL_SEP)
    fp.Write vaCol(0) & vbTab   ' path
    fp.Write vaCol(1) & vbTab   ' nome
    fp.Write vaCol(2) & vbTab   ' dimensione
    fp.Write vaCol(3) & vbTab   ' data/ora
    fp.WriteLine ""
  Next
  fp.Close
End Sub
' ========================= FINE
 
 
 


Con il DOS ho smesso di lavorarci oprmai 30 anni fa. Quindi molto arruginito
 :-( :-(
Comunque ci provo.
 
Grazie mille
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 


Se sei lo stesso Obiwan degli anni '90 quando si discettava di programmi 
satellitari, eventualmente trasmessi dal Thor 0,8°W lo credo che per te non 
ci voglia nulla a fare un programmino del genere. :-) :-) :-)
Lo provo, sperando di aver capito a sufficenza. Sai comìè, oltre 
all'arrugginimento dovuto alla mancanza totale di esercizio 
ultratrentennale, anche la vetusta età senile non aiuta molto.
 
Grazie Obiwan, grazie mille.
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 


Aggiungo, se posso permettermi, l'indirizzo della cartella contenente i file 
da indicizzare anche per titolo:
 
n:\gpl\video
 
Grazie ancora
-- 
Giampaolo Natali
giampaol...@alice.it
 
 


 
Carina l'idea della  printf()  in vbs
 
 
-- 
ciao
  Stefano

 n:\gpl\video
 
in tal caso, supponiamo che tu abbia salvato il file nella cartella
"c:\scanfiles" con il nome "scanfiles.vbs", a questo punto, apri un
prompt comandi e quindi...
 
cd /D c:\scanfiles
cscript //nologo scanfiles.vbs n:\gpl\video
 
al termine, il file "filelist.txt" presente nella cartella "scanfiles"
conterrà l'elenco (separato da caratteri di tabulazione) relativo a
tutti i files della cartella "n:\gpl\video" e di tutte le sottocartelle
 
ciao
 



roba standard, per il vbs (e non solo) ho dei blocchi di codice già
pronti, mi basta un copia/incolla, aggiungo il resto del codice
relativo alla logica che voglio implementare e via :)
 
Per dire, questo è uno "snippet" che implementa il sort di un array
 
 
' CombSort routine - sorts the array in place
' ref: 
http://en.wikipedia.org/wiki/Combsort
 
'      
http://en.wikipedia.org/wiki/Category:Sort_algorithms
 
Sub CombSort(vaData)
  Dim iLow, iHigh
  Dim iElem, iSwap, vTemp
  Dim bSwapped, nGap
 
  On Error Resume Next  
 
  iLow = LBound(vaData)
  iHigh = UBound(vaData)
  nGap = iHigh
  bSwapped = True
  While bSwapped
    nGap = (nGap * 10) \ 13
    If (nGap < 1) Then
      nGap = 1    
    ElseIf (nGap = 10) Or (nGap = 9) Then
      nGap = 11
    End If
    bSwapped = (nGap <> 1)
    For iElem = iLow To iHigh - nGap
      iSwap = iElem + nGap
      If vaData(iElem) > vaData(iSwap) Then
        vTemp = vaData(iElem)
        vaData(iElem) = vaData(iSwap)
        vaData(iSwap) = vTemp
        bSwapped = True
      End If
    Next
  Wend
End Sub
 
ciao :)
 

Per dire, questo è uno "snippet" che implementa il sort di un array
 
Io mi sono fatto questo diverso tempo fa, che usa il classico bubble sort ma è
farina del mio sacco:
 
________________________________________
 
'BUBBLE SORT OF LENGHT
	n = UBound(Lngt)
  Do
	nn = -1
	For j = LBound(Lngt) to n - 1
		If Lngt(j,0) > Lngt(j + 1,0) Then
			TempValue = Lngt(j + 1, 0) : TempValue1 = Lngt(j + 1, _
1): TempValue2 = Lngt(j + 1, 2)
			Lngt(j + 1, 0) = Lngt(j, 0) : Lngt(j + 1, 1) = Lngt(j, _
1) :Lngt(j + 1, 2) = Lngt(j, 2)
			Lngt(j, 0) = TempValue : Lngt(j, 1) = TempValue1 : _
Lngt(j, 2) = TempValue2
			nn = j
		End If
	Next
	n = nn
  Loop Until nn = -1
__________________________________________
 
 
è abbastanza veloce, in ~ 1 - 2 secondi ordina array da qualche migliaio di
elementi, considerando anche che la matrice è multidimensionale.
 
-- 
ciao
  Stefano

 multidimensionale.
 
se consideri veloce il bubble, prova il combsort :D tra l'altro, nel
caso di array multidimensionali, sarebbe meglio evitare lo swap degli
elementi ed implementare un ordinamento indicizzato, in pratica
all'inizio del codice del sort avrai qualcosa del tipo
 
 Redim arrIdx(maxElem)
 For i=0 To maxElem
   arrIdx(i) = arrDati(i, 0)
 Next
 
a questo punto, lasciando invariato il codice di ordinamento l'unica
cosa che dovrai fare è usare il contenuto di arrIdx() per confrontare
gli elementi e scambiare il contenuto di arrIdx() per riordinarli, al
termine l'array originale avrà lo stesso ordine iniziale ma arrIdx()
potrà essere usato per estrarre gli elementi in ordine, la cosa ti
permette di guadagnare tempo nel caso di array multidimensionali e di
grandi dimensioni
 

grandi dimensioni
 
Interessante, non ci avevo pensato
 
-- 
ciao
  Stefano

 > Next
 
Oops ho scritto una fesseria
 
Redim arrIdx(maxElem)
For i=0 To maxElem
  arrIdx(i) = i
Next i
 
ecco, così è corretto, in pratica l'array viene inizializzato con gli
indici degli elementi, questi vengono poi utilizzati all'interno del
sort per reperire gli elementi da confrontare ma lo scambio viene poi
effettuato tra gli elementi di arrIdx() che, al termine del sort
conterrà gli indici ordinati, a quel punto per estrarre gli elementi
dell'array dati (il cui ordinamento sarà rimasto invariato) basterà
qualcosa del genere
 
For i=0 To maxElem
  print arrDati(arrIdx(i), 0)
Next i
 
il vantaggio del sort indicizzato è quello di effettuare scambi solo
sull'array numerico degli indici (operazione molto più veloce) e di
evitare, nel caso di array multidimensionali di dover scambiare tutti
gli elementi, in questo modo si guadagna parecchio tempo; certo, resta
un overhead dovuto al precaricamento dell'array indice, ma di solito
quella è un'operazione piuttosto veloce anche nel caso di molti elementi
 
 
 

 Il mio problema è il seguente:
 
Allora... risolto ?
 


Non ho ancora avuto tempo di provare, ma relazionerò qui cosa cavolo 
riuscirò a fare :-) :-)
 
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

 riuscirò a fare :-) :-)
 
Copiato il tuo file, salvato sul disco C:\scanfiles.vbs
 
Da prompt comandi ho scritto (per vedere cosa succede): c:\scanfiles.vbs
 
la risposta è:
 
Script:             c:\scanfiles.vbs
Riga                67
Carattere           3
Errore:            impossibile trovare il percorso
Codice           800A004C
Origine           Errore di run-time di Microsoft VBScript
 
Poi da prompt comandi (file esegui) ho scritto:
cscript //nologo scanfiles.vbs n:\gpl\video
 
in una frazione di secondo si apre e si chiude la solita finestra nera.
Naturalmente non trovo nessun filelist.txt
Altrettanto naturalmente ho fatto qualche errore di sbaglio :-) :-) :-)
 
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

Sembra che ObiWan abbia detto :

ciao, scusa se mi intrometto, anche io ho copiato il tuo ottimo file, 
ma eseguendolo ricevo lo stesso errore dichiarato dal Giampaolo.
Ho pensato ad una tua svista e per sicurezza, dopo molti mesi, ho 
provato a lanciare altri piccoli vbs che avevo ed avevano sempre 
funzionato.
Invece tutti hanno evidenziato un errore. Ne ho dedotto che nei miei 
smanettamenti devo aver combinato qualcosa di globale, per esempio il 
comando SFC / Scannow non va, dichiarando la protezione risorse di 
Windows.
Che cosa potrei fare per riabilitare *drasticamente* almeno i vbs ? 
(che non siano i soliti consigli generici del web ? )
Grazie

ecco, così è corretto, 
 
non mi sembra, quell'array contiene solo i numeri da 0 a maxElem
già ordinati.
 
Quello precedente invece funziona, ma ha lo svantaggio che per esempio in caso
di 3 elementi che abbiano la stessa lunghezza o stesso arrDati(i, 0) ma diversi
arrDati(i, 1)  o arrDati(i, 2) usa sempre il primo valore (,1) e (,2) riportato
3 volte.
 
Ho risolto ricopiando i dati su un altro array verificando ogni volta se il
valore  (i, 1) sia già stato usato, così funzia, è sembra anche un po' più
veloce.
 
 
-- 
ciao
  Stefano

 già ordinati.
 
infatti, è quello che deve fare, poi, nel codice del sort fai qualcosa
di questo tipo
 
Function CombSort(vaData)
  Dim iLow, iHigh
  Dim iElem, iSwap, vTemp
  Dim bSwapped, nGap
  Dim vaIdx, idx1, idx2
 
  On Error Resume Next  
 
  iLow = LBound(vaData)
  iHigh = UBound(vaData)
 
	' carica l'array indice  
  ReDim vaIdx(iLow To iHigh)
  For iElem = iLow To iHigh
    vaIdx(iElem) = iElem
  Next
 
  ' esegue il sort ordinando la matrice che
  ' contiene gli indici degli elementi e non
  ' l'array degli elementi
  nGap = iHigh
  bSwapped = True
  While bSwapped
    nGap = (nGap * 10) \ 13
    If (nGap < 1) Then
      nGap = 1    
    ElseIf (nGap = 10) Or (nGap = 9) Then
      nGap = 11
    End If
    bSwapped = (nGap <> 1)
    For iElem = iLow To iHigh - nGap
      iSwap = iElem + nGap
      ' indici degli elementi da confrontare
      idx1 = vaIdx(iElem)
      idx2 = vaIdx(iSwap)
      If vaData(idx1) > vaData(idx2) Then
      	' scambia di posto i valori dell'indice
      	' e NON quelli dell'array
        vTemp = vaIdx(iElem)
        vaIdx(iElem) = vaIdx(iSwap)
        vaIdx(iSwap) = vTemp
        bSwapped = True
      End If
    Next
  Wend
 
  ' ritorna l'array con l'indice ordinato
  CombSort = vaIdx
End Function
 
 
nel tuo caso (array multidimensionale) ti basta modificare l'"if" di
confronto ottenendo un codice del genere
 
Function CombSort(vaData)
  Dim iLow, iHigh
  Dim iElem, iSwap, vTemp
  Dim bSwapped, nGap
  Dim vaIdx, idx1, idx2
 
  On Error Resume Next  
 
  iLow = LBound(vaData)
  iHigh = UBound(vaData)
 
	' carica l'array indice  
  ReDim vaIdx(iLow To iHigh)
  For iElem = iLow To iHigh
    vaIdx(iElem) = iElem
  Next
 
  ' esegue il sort ordinando la matrice che
  ' contiene gli indici degli elementi e non
  ' l'array degli elementi
  nGap = iHigh
  bSwapped = True
  While bSwapped
    nGap = (nGap * 10) \ 13
    If (nGap < 1) Then
      nGap = 1    
    ElseIf (nGap = 10) Or (nGap = 9) Then
      nGap = 11
    End If
    bSwapped = (nGap <> 1)
    For iElem = iLow To iHigh - nGap
      iSwap = iElem + nGap
      ' indici degli elementi da confrontare
      idx1 = vaIdx(iElem)
      idx2 = vaIdx(iSwap)
      If vaData(idx1, 0) > vaData(idx2, 0) Then
      	' scambia di posto i valori dell'indice
      	' e NON quelli dell'array
        vTemp = vaIdx(iElem)
        vaIdx(iElem) = vaIdx(iSwap)
        vaIdx(iSwap) = vTemp
        bSwapped = True
      End If
    Next
  Wend
 
  ' ritorna l'array con l'indice ordinato
  CombSort = vaIdx
End Function
 
e la chiamata sarà qualcosa del tipo
 
  Dim vaIndex, i
 
  vaIndex = CombSort(vaData)
  For i = LBound(vaData) To UBound(vaData)
   print vaData(vaIndex(i))
  Next
 
chiaro ora ?
 
 

 Copiato il tuo file, salvato sul disco C:\scanfiles.vbs
 
Ufff :P
 
start -> esegui -> cmd <invio>
 
una volta al prompt comandi, immetti
 
cscript //nologo c:\scanfiles.vbs n:\gpl\video <invio>
 
eventuali messaggi di errore verranno visualizzati nella finestra di
console (cmd); lo script NON è fatto per essere avviato con un doppio
click o comunque da Wscript, se lo vuoi usare devi fare come scritto
sopra.
 
considera che il percorso "n:\gpl\video" DEVE esistere ed essere
accessibile
 

 (che non siano i soliti consigli generici del web ? )
 
Una bella passata con un antivirus offline; scarichi la iso o il tool
di creazione su un ALTRO PC (che sia pulito), crei il CD/DVD, e lo usi
per avviare il tuo PC e procedere con la scansione del sistema.
 
 
 

Dopo dura riflessione, ObiWan ha scritto :

grazie del consiglio, ho appena scaricato il RescueDisk di Kasperky, 
tuttavia prima di proseguire mi chiedo se, dal momento che ho diversi 
motivi per ritenermi NON infetto, ci possano essere altre cause che 
impediscono SFC e i vbs.

 impediscono SFC e i vbs.
 
Se hai un account "admin" e se la macchina NON è a dominio, direi
nessuno, tranne appunto un rootkit o comunque una qualche bestiaccia
 

 
 
ho provato lo script 2 secondi fa senza alcun problema :)
 

It was Mon, 18 Jun 2018 15:31:09 +0200 when

dimenticavo, il percorso passato allo script (nell'esempio
"n:\gpl\video") deve esistere ed essere accessibile :-P !
 

 ha
scritto:

E' abbastanza strano che non ti funzioni il solito "sfc /scannow", quello mi fa
pensare che ti servirebbe quantomeno un controllo AV offline.
 
Il VBS usa Wscript.exe o Cscript.exe e la VBSCRIPT.DLL, nient'altro che io
sappia.
 
Potrebbero anche essere delle voci di registro corrotte, hai qualche messaggio
di errore se lanci un vbs?
 
 
-- 
ciao
  Stefano

Invece tutti hanno evidenziato un errore.
 
Se è l'error 2738 leggi qui:
 
https://jakeludington.com/2009/11/15/error_2738_coul/
 
 
 
-- 
ciao
  Stefano

di questo tipo
 

Ho provato.
Non riesco a passargli l'array multidimensionale, ottengo sempre degli errori di
indice.
Alla fine ho usato una Call, che evita le riassegnazioni.
In pratica ho spostato la Dim  vaIdx() fuori dalla routine
 
  Dim vaIdx()
  Call CombSort(Lngt)
 
E qualcosa fa, ma non come dovrebbe.
 
Mi spiego meglio:
 
 
Questo è l'array ordinato che ottengo con mio il bubble, (solo le prime righe)
 
 n,0        n, 1      n, 2
 
30,06	1189	68	
30,08	1369	51	
30,10	1033	41	
30,18	157	40	
30,24	327	62	
30,42	259	65	
30,45	242	69	
30,45	527	44	
30,46	260	26	
30,47	1467	57	
30,71	1191	51	
30,85	162	74	
31,00	159	78	
31,00	850	57	
31,11	166	45	
 
Questo è quello che mi riporta l'array vaIdx(i), monodimensionale, dopo la
chiamata:
 
1188
1368
1032
156
326
258
241
526
259
1466
1190
161
849
158
165
 
quindi mi ha ordinato Lngt(n, 0) ma poi vaIdx(i) riporta  Lngt(n, 1)
e c'è anche una differenza di 1, che si potrebbe facilmente compensare.
 
Ma il problema è passargli l'array multidimensionale.
 
-- 
ciao
  Stefano

Ma il problema č passargli l'array multidimensionale.
 
La subroutine del bubble invece non ha problemi con i multidimensionali:
______________
 
Sub Bsort(arrD)
 
	Ua = UBound(arrD)-1
	La = LBound(arrD)
  Do
	nn = -1
	For j = La to Ua
		If arrD(j) > arrD(j + 1) Then
			TempValue = arrD(j + 1)
			arrD(j + 1) = arrD(j)
			arrD(j) = TempValue
			nn = j
		End If
	Next
	n = nn
  Loop Until nn = -1
End Sub
____________
 
Boh
 
 
-- 
ciao
  Stefano

____________
 
Questo č monodimensionale :-(
 
vabbč, ormai sono fuso....
 
-- 
ciao
  Stefano


Te lo aveo detto che avevo fatto un errore di sbaglio, no? :-) :-)
 
OK, funziona e indicizza 900 file in circa 4 secondi.
Però ho un altro problema, tanto per cambiare :-)
 
Dopo trasportato il file filelist.txt in excel, se indicizzo con tabulazione 
ottengo una serie infinita, si fa per dire, di colonne descrittive del 
titolo del video.
Come posso fare per inserire, per esempio, il punto e virgola come 
delimitatore fra la colonna direttrice, poi il numero, poi il titolo del 
film poi tutto il resto?
Posso tranquillamente eliminare le dimensioni dei file e la data se può 
essere utile.
 
Grazie ancora per la tua infinita pazienza
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 


Ormai sono fuso e mi scuso per la imprecisione:
 
il file viene suddiviso in quattro colonne:
 
direttrice/sottocartella
numero e titolo file
dimensioni del file
data del file
 
Io ho bisogno di separare il numero del file dal titolo per poter poi 
indicizzare il tutto come mi aggrada.
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

 messaggio di errore se lanci un vbs?
 
è probabilissimo che io abbia varie voci di registro corrotte, anche 
dai miei smanettamenti continui, sia automatici e manuali, ma credevo 
che WindowsRepair fosse la panacea. Ora non mi resterebbe che studiare 
a fondo l'opzione DISM, o reinstallare su altro HD, perchè sinceramente 
sono contrario alla formattazione

 ha scritto:
 
Allora, alla fine ci sono riuscito e va a scheggia.
 
Ho rinunciato a fare il passaggio tramite argomenti di funzioni e ho risolto
aggiungendo l'array LngtS(n, 2), su cui alla fine copio i dati secondo l'ordine
creato dalla CombSort()
 
Sono soddisfatto e ti ringrazio della dritta.
_____________________________________-
 
 Dim vaIdx(),LngtS()
 
 Call CombSort()
 
'****************
 
Sub CombSort()
  Dim iLow, iHigh, i,  k, L
  Dim iElem, iSwap, vTemp
  Dim bSwapped, nGap, idx1, idx2
'  Dim vaIdx()
 
  On Error Resume Next  
 
  iLow = LBound(Lngt)
  iHigh = UBound(Lngt)
 
' carica l'array indice  
  ReDim vaIdx(iHigh)
  For iElem = iLow To iHigh
    vaIdx(iElem) = iElem
  Next
 
  ' esegue il sort ordinando la matrice che
  ' contiene gli indici degli elementi e non
  ' l'array degli elementi
  nGap = iHigh
  bSwapped = True
 
  While bSwapped
 
    nGap = (nGap * 10) \ 13
    If (nGap < 1) Then
      nGap = 1    
    ElseIf (nGap = 10) Or (nGap = 9) Then
      nGap = 11
    End If
    bSwapped = (nGap <> 1)
 
    For iElem = iLow To iHigh - nGap
      iSwap = iElem + nGap
      ' indici degli elementi da confrontare
      idx1 = vaIdx(iElem)
      idx2 = vaIdx(iSwap)
      If Lngt(idx1, 0) > Lngt(idx2, 0) Then
	' scambia di posto i valori dell'indice
	' e NON quelli dell'array
	vTemp = vaIdx(iElem)
	vaIdx(iElem) = vaIdx(iSwap)
	vaIdx(iSwap) = vTemp
	bSwapped = True
      End If
    Next
  Wend
 
'ora ricopia l'array ordinato
 ReDim LngtS(iHigh, 2)
  For i = iLow To iHigh
    L = vaIdx(i)
      For k=0 To 2
        LngtS(i, k)=Lngt(L, k)
      Next k
  Next  i
 
End Sub
 
 
-- 
ciao
  Stefano

sono contrario alla formattazione
 
Anch'io non uso antivirus realtime e non formatto mai, ma faccio scansioni
antivirus offline e ho diverse immagini del s.o. create con Aomei backupper.
 
In caso di problemi in 15-20 minuti posso ripristinare la partizione del s.o. e
tornare ad una situazione sicura, per esempio quest'anno l'ho già fatto anche se
poi ho scoperto che non era un problema di virus o di s.o. ma di un baco di un
programma dopo un aggiornamento, porc...
 
 
 
-- 
ciao
  Stefano

 Non riesco a passargli l'array multidimensionale, ottengo sempre
 
perchè, per gestire un array multidimensionale devi modificare il
codice, eccoti un esempio (poi però basta, siamo OT :D)
 
 
' dati
Dim vaData, i, j,  n
Dim vaIndex, s
 
' alloca l'array
ReDim vaData(100, 3)
 
' inizializza il generatore casuale
Randomize Timer
 
' carica valori casuali nell'array
For i = 0 To 100
  For j = 0 To 3
    n = RandNum(100, 999)
    vaData(i, j) = n
  Next
Next
 
' riordina e genera l'indice
vaIndex = CombSort(vaData)
 
' dump dell'array ordinato usando l'indice
For i=LBound(vaIndex) To UBound(vaIndex)
  j = vaIndex(i)
  s = vaData(j, 0) & " " & vaData(j, 1) & " " & vaData(j, 2)
  WScript.StdOut.WriteLine s	
Next
 
' genera un numero casuale tra min e max
Function RandNum(min, max)
  RandNum = Int((max - min + 1) * Rnd + min)
End Function
 
' ====================================
 
Function CombSort(vaData)
  Dim iLow, iHigh
  Dim iElem, iSwap, vTemp
  Dim bSwapped, nGap
  Dim vaIdx, idx1, idx2
 
  iLow = LBound(vaData,1)
  iHigh = UBound(vaData,1)
 
  ' carica l'array indice  
  ReDim vaIdx(iHigh - iLow + 1)
  For iElem = iLow To iHigh
    vaIdx(iElem) = iElem
  Next
 
  ' esegue il sort ordinando la matrice che
  ' contiene gli indici degli elementi e NON


codice, eccoti un esempio (poi però basta, siamo OT :D)
 
Vabbè, ma  c'è tanto traffico sul ng che se non ce lo diciamo da soli non ce lo
dice nessuno  :-)
 
Il tuo esempio alla fine ha funzionato,  ho solo aggiunto all' inizio:
 
Set Fso = CreateObject ("Scripting.FileSystemObject")
Set StdOut = Fso.GetStandardStream (1)
 
e dopo averlo salvato ho dato il comando da Prompt:
 
Cscript Test.vbs
 
con Wscript (il default) mi dava un errore di handle.
 
Adesso vedo anche di capire perchè non riesco a passare alla funzione un array
multidimensionale nel mio programma.

-- 
ciao
  Stefano

 un array multidimensionale nel mio programma.
 
se vuoi, crea un esempio di codice con sort, array e tutto che NON
funziona, quindi apri questo sito 
https://pastebin.com/
 incolla il
codice e posta qui l'URL risultante; così io ed altri potremmo dare
un'occhiata e capire dove si "incastra"
 
Per il resto, sebbene il combsort sia più veloce del quicksort solo in
certi casi (array parzialmente ordinati); è molto più veloce del bubble
e comunque, in applicazioni reali, dove i dataset possono (e spesso
sono) essere parzialmente ordinati (pensa ad un file ottenuto copiando
insieme più files diversi, ordinati) di norma risulta mediamente essere
più efficiente e, per lo meno, di velocità paragonabile al quicksort :)
 
https://it.wikipedia.org/wiki/Comb_sort
 
 
https://it.wikipedia.org/wiki/Bubble_sort
 
 
https://it.wikipedia.org/wiki/Quicksort
 
 
 
ciao
 

 - OK
 
Apri il vbs e posta qui il contenuto delle righe dalla 49 alla 51;
inoltre, COME hai lanciato lo script ? Con doppio click NON funziona, e
comunque l'argomento passato deve corrispondere ad un path esistente
 

 Però ho un altro problema, tanto per cambiare :-)
 
beh, quello lo devi risolvere in excel, lo script è generico (in modo
da poter essere riutilizzato), se ti serve manipolare il nome dei
files, o il formato di output, modifica lo script; ad esempio, se
invece del "tab" preferisci usare il ";" ti basterà cambiare il codice
che scrive il file dei risultati, nel caso in questione ecco come
modificare il codice
 
Sub SaveList(dicFiles, sFile)
  Dim fp, itm, vaCol
 
  Set fp = fso.OpenTextFile(sFile, ForWriting, True)
  For Each itm In dicfiles.Items
    vaCol = Split(itm, COL_SEP)
    fp.Write vaCol(0) & ";"   ' path
    fp.Write vaCol(1) & ";"   ' nome
    fp.Write vaCol(2) & ";"   ' dimensione
    fp.Write vaCol(3) & ";"   ' data/ora
    fp.WriteLine ""
  Next
  fp.Close
End Sub
 
se poi vuoi "manipolare" il nome del file, modifica quanto sopra in
modo da rispondere alle tue esigenze, oppure (meglio) elabora il file
così come è in excel
 
ciao
 
 
 
 

più efficiente e, per lo meno, di velocità paragonabile al quicksort :)
 
Il vbs serve per decifrare dei .log che mi arrivano ogni tanto da delle macchine
in giro, ma li uso poche volte al giorno, quindi la velocità di sort non è poi
così importante.
 
Invece è stato interessante l'esercizio ComboSort, e ti ringrazio ancora per
l'aiuto e il tempo.
 
 
-- 
ciao
  Stefano


Non cambia nulla.
Il nome file viene riportato identico in excel, sia con separatore tab o 
altro separatore, cioè:  "12345 Abcdefghilm.mp4" "dimensione" "data/ora".
Mentre io vorrei ottenere: 12345; Abcdefghilm.mp4; dimensione;data/ora
Mi basta la stringa o stringhe per poter suddividere il nome in due parti: 
numero e tutto il resto.
Occorrerebbe far separare  e indicare come campo "numero" i primi 6 
caratteri del "nome file originale" poi come campo "nome" tutto il resto.
Non so se in excel sia fattibile questa operazione.
Sto abusando troppo della tua pazienza, me ne rendo conto.
 
Ciao e grazie comunque
 
 
 
 
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

 tab o altro separatore, cioè:  "12345 Abcdefghilm.mp4" "dimensione"
 
in tal caso devi spezzare il nome del file, se il formato è quello
sopra, ossia un numero, UNO spazio ed il resto del nome, non vedo
problemi, basta qualcosa del genere
 
Sub SaveList(dicFiles, sFile)
  Dim fp, itm, vaCol
  Dim sName
 
  Set fp = fso.OpenTextFile(sFile, ForWriting, True)
  For Each itm In dicfiles.Items
    vaCol = Split(itm, COL_SEP)
    sName = vaCol(1)
    sName = Replace(sName, " ", ";")
    vaCol(1) = sName
    fp.Write vaCol(0) & ";"   ' path
    fp.Write vaCol(1) & ";"   ' nome (in 2 parti)


 problemi, basta qualcosa del genere
 
meglio questo dato che nel caso vi siano altri spazi, il codice sotto
sostituisce con il ";" solo il primo, così non ci saranno problemi nel
caso in cui il nome del file contenga degli spazi, inoltre il codice di
cui sotto aggiunge anche un'intestazione con il nome delle colonne
 
Sub SaveList(dicFiles, sFile)
  Dim fp, itm, vaCol
  Dim sBuff
 
  ' apre il file in scrittura
  Set fp = fso.OpenTextFile(sFile, ForWriting, True)
 
  ' scrive la riga di intestazione
  fp.WriteLine "path;numero;nome;dimensione;dataora"
 
  ' cicla sugli elementi e li scrive su file
  For Each itm In dicfiles.Items
    ' spezza il record in colonne
    vaCol = Split(itm, COL_SEP)
 
    ' sostituisce il primo spazio nel nome file con un ";" 
    vaCol(1) = Replace(vaCol(1), " ", ";", 1, 1)
 
    ' crea il record dati 
    sBuff = Join(sBuff, ";")
 
    ' scrive il record nel file
    fp.WriteLine sBuff
  Next
 
  ' chiude il file
  fp.Close
End Sub
 
e con questo, dovremmo essere a posto, spero :)
 
 

It was Tue, 19 Jun 2018 14:27:29 +0200 when

trovato; o hai una versione del motore di scripting vecchiotta, oppure
hai lanciato il file direttamente o facendoci doppio click; eccoti una
pezza che risolverà entrambi i problemi
 
Sub printf(sTxt)
  WScript.Echo sTxt
End Sub
 
 

Dopo dura riflessione, ObiWan ha scritto :

scusami, ieri ho passato molto tempo a masterizzare e usare Kaspersky 
Rescue, quando sono riuscito a farlo partire ha passato molto tempo 
senza trovare niente, poi mi si è spento il pc per surriscaldamento, 
prima della metà del lavoro. Oggi riprovo (diverse ore...)
 
ecco le righe 49-51 della tua prima versione:
 
Sub printf(sTxt)
  WScript.StdOut.WriteLine sTxt
End Sub
 
il motore dovrebbe essere 5.7, in passato usavo sia il doppio click che 
la CLI, ora ho lanciato molti vbs in diversi modi possibili, anche 
suggeriti dal prog stesso, niente da fare.
 
non ci rimetto niente a fare la tua modifica, ma io faccio il 
ragionamento analogico della scimmia dicendo che se tutti i miei vbs 
prima funzionavano e ora danno tutti un errore di vario tipo a diverse 
linee e caratteri, errore di run time, errore null, ecc, sono piu che 
depresso.
Se abbino il fatto che SFC non va per motivo di blocco risorse, e da 
ieri pure il windows defender, che pur funziona, ha smesso di essere 
riconosciuto dal Centro Operativo, non so più che cosa immaginare.
Pur avendo conoscenze non poche ma limitate mi son fatto l'idea che il 
mio continuo smanettare abbia corrotto una serie di chiavi di registro, 
altra spiegazione non trovo.

Scriveva Zipper mercoledì, 20/06/2018:
 
riepilogando, ho preso la prima versione del tuo file, nelle 3 righe ho 
sostituito le tue 3 nuove e ho eseguito
 
C:\>cscript scanfiles.vbs //nologo c:\users\utente\downloads\video\*.*
 
con e senza slash, con e senza wildcards, risposta:
 
C:\scanfiles.vbs(66, 3) Errore di run-time di Microsoft VBScript: 
Impossibile trovare il percorso

 e con questo, dovremmo essere a posto, spero :)
 
Sei un mago della programmazione e un santo per la pazienza.
 
Grazie Obiwan, grazie davvero.
 
Appena termina uno spostamento di file da un HD ad altro HD (tre ore circa 
di lavoro) lo provo.
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

altra spiegazione non trovo.
 
Può essere, ma il rimedio è un'immagine del s.o. da ripristinare all'occasione,
esistono Aomei Backupper, Macrium Reflect free per dire i più famosi, è una cosa
da avere per forza.
 
Altrimenti ti tocca la formattazione.
 
Riguardo al problema del percorso della directory, per vedere se è un errore di
path,
all'inizio, dopo
 
  sPath = argv(0)
aggiungi questa parte:
 
  If  Not Fso.FolderExists(sPath) Then
'	'MsgBox  Fold  , vbCritical, "IS NOT FOLDER"  :Wscript.Quit
	printf    Fold  & vbCr & "*IS NOT FOLDER*"   :Wscript.Quit
  End If
 
Il messaggio che eventualmente compare ti dice cosa contiene effettivamente
'sPath' e se è un path effettivamente presente sul tuo pc.
 
ciao
 
[*] 
https://goo.gl/XycEr6
 
 
 


Il messaggio che eventualmente compare ti dice cosa contiene effettivamente
'sPath' e se è un percorso che NON è effettivamente presente sul tuo pc.
 
 
 
-- 
ciao
  Stefano

 circa di lavoro) lo provo.
 
Ecco, fammi sapere; considera che il codice (di tutto lo script) NON è
assolutamente ottimizzato e si potrebbe rendere più veloce, ma per
quello, pensaci tu... o chiedi a qualcun altro, please :D
 
 

 con e senza slash, con e senza wildcards, risposta:
 
1. chi ha scritto di usare le wildcards ?
 
2. se il path contiene spazi racchiudilo tra doppi apici
 
3. se ancora non ce la fai... lascia perdere :)
 
 

Il 20/06/2018, ObiWan ha detto :

proprio adesso ho trovato un bandolo: avendo 5 computer, su uno di 
questi ho messo la tua prima versione, scanfiles.vbs: ha funzionato !!!
quindi tutti i altri problemi riguardano il S.O. del portatile, che mi 
arrangerò a rimediare.
Solo una grande cortesia: potresti ripostare almeno il combsort 
completo di correzioni ?
Tutto ciò che è sorting, combination e permutation mi affascina e ne 
faccio grande uso.
Grazie miliardi

 [*] 
https://goo.gl/XycEr6
 
 
ho risposto sinteticamente a ObiWan, cmq i problemi del portatile 
evidentemente esistono e mi chiedo, si fa per dire, se abbia senso 
farsi l'"immagine" di un S.O. malmesso.
Roba hardware non la so maneggiare e porto il pc ad un riparatore.

 wrote:
 
 
Ok, versione riveduta anche per i mousedipendenti che non sanno come
funziona una linea comando <eg>
 
Option Explicit
 
'
' da prompt comandi:
'
'
' cscript //nologo scanfiles.vbs outfile x:\percorso
'
' al termine viene generato il file specificato come
' "outfile" e contenente l'elenco dei files all'interno
' del percorso specificato e di tutte le sottocartelle
' dello stesso
'
 
' I/O su file
Const ForReading = 1, ForWriting = 2, ForAppending = 8
 
' separatore interno
Const COL_SEP = "|"
 
' oggetti globali
Dim fso, arg
 
' start
Set fso = CreateObject("Scripting.FileSystemObject")
Set arg = WScript.Arguments
WScript.Quit main(arg.Count, arg)
 
' main() stile "C"
Function main(argc, argv)
  Dim sPath, sFile
  Dim dicFiles
 
  ' controllo argomenti
  If argc <> 2 Then
    Help  
    main = 1
    Exit Function
  End If
 
  ' valorizza argomenti
  sPath = argv(0)
  sFile = argv(1)
 
  ' check iniziali
  If Not fso.FolderExists(sPath) Then
    printf "Cartella " & sPath & " inesistente."
    main = 2
  End If
  If fso.FileExists(sFile) Then
    fso.DeleteFile sFile, True
  End If
 
  ' crea l'elenco dei files
  Set dicFiles = CreateList(sPath)
  If dicFiles.Count = 0 Then
    printf "Nessun file presente nel percorso " & sPath
    main = 3
    Exit Function
  End If
 
  ' salva l'elenco su "outfile" ed esce
  SaveList dicFiles, sFile
 
  ' se errorlevel=0, tutto Ok
  main = 0
End Function
 
' un minimo di aiuto
Sub Help()
  Dim sHelp
 
  sHelp = "uso: cscript scanfiles.vbs outfile percorso" & vbCrLf & _
          "es.: scanfiles.vbs d:\xyz\filelist.txt c:\images" 
 
  printf sHelp
End Sub
 
' messaggi a console (o msgbox per i mousedipendenti)
Sub printf(sTxt)
  WScript.Echo sTxt
End Sub
 
' messaggi di errore
Sub perror(sSrc)
  Dim sErr
 
  sErr = "0x" & Hex(Err.Number) & " " & Err.Description
  If Len(sSrc) > 0 Then
    sErr = sErr & " :: " & sSrc
  End If
  printf sErr
End Sub
 
' crea l'elenco dei files per il percorso specificato
Function CreateList(sPath)
  Dim dicFiles, lRet
  Dim aFiles, iFil
 
  Set dicFiles = CreateObject("Scripting.Dictionary")
  ScanFolder sPath, dicFiles
  Set CreateList = dicFiles  
End Function
 
' esegue la scansione ricorsiva del percorso
Sub ScanFolder(sPath, dicFiles)
  Dim fld, sfd, fil
  Dim sBuff
 
  On Error Resume Next
  Err.Clear
  Set fld = fso.GetFolder(sPath)
  If Err.Number <> 0 Then
    perror "ScanFolder(" & sPath & ")"
    Exit Sub
  End If
  For Each fil In fld.Files
    sBuff = fil.ParentFolder & COL_SEP
    sBuff = sBuff & fil.Name & COL_SEP
    sBuff = sBuff & fil.Size & COL_SEP
    sBuff = sBuff & fil.DateLastModified
    dicfiles.Add dicfiles.Count, sBuff
  Next
  For Each sfd In fld.SubFolders
    ScanFolder sfd.Path, dicFiles
  Next  
End Sub
 
' salva l'elenco in "outfile"
Sub SaveList(dicFiles, sFile)
  Dim fp, itm, vaCol
  Dim sBuff
 
  On Error Resume Next  
  Err.Clear
  Set fp = fso.OpenTextFile(sFile, ForWriting, True)
  If Err.Number <> 0 Then
    perror "SaveList(" & sFile & ")"
    Exit Sub
  End If
 
  For Each itm In dicfiles.Items
    vaCol = Split(itm, COL_SEP)
    ' commentare la linea seguente per evitare che il
    ' primo spazio del nome file venga rimpiazzato da
    ' un ";" dato che questo serve solo a Giampaolo :)
    vaCol(1) = Replace(vaCol(1), " ", ";", 1, 1)
    For i = LBound(vaCol) To UBound(vaCol)
      vaCol(i) = Chr(34) & vaCol(i) & Chr(34)
    Next
    sBuff = Join(vaCol, ";")
    fp.WriteLine sBuff
  Next
  fp.Close
End Sub
 
 

Scriveva ObiWan nel messaggio 20806

ripeto il mio grazie, ma io sono nato ai pc 30 anni fa, epoca DOS, e 
apprezzo e uso appieno la linea di comando.

Roba hardware non la so maneggiare e porto il pc ad un riparatore.
 
Giustissimo, però tieni presente che alla lunga un processore troppo caldo può
danneggiarsi.
 
Controlla le temperature con HWMonitor, esiste anche portabile (zip)
 
https://www.cpuid.com/softwares/hwmonitor.html
 
 
e se vedi dei valori alti, beh...
 
 
-- 
ciao
  Stefano

Dopo dura riflessione, SB ha scritto :

ti ringrazio molto per tutti i consigli, il motivo principale per cui 
non ho mai fatto immagini è che lo spazio occupato da files e dati è 
maggiore di quello restante, per cui immaginavo una cosa difficile che 
comunque avrebbe una soluzione, ma non volevo sbattermi.
Adesso è ora di farla.
Riguardo altre cose come la temperatura...sono ben provvisto, da tempo 
uso un ventilatore USB che soffia sotto il culetto del laptop...e altre 
cose fatte di corsa, prima avevo più calma per tutto.

 completo di correzioni ?
 
Correzioni ? Il codice era già a posto la prima volta che l'ho postato,
solo che nel caso in questione si trattava di un array
multidimensionale per cui ho modificato il sort per gestirlo, ma il
codice originale funziona senza problemi su un array monodimensionale;
ad ogni modo il codice originale è questo
 
Sub CombSort(vaData)
  Dim iLow, iHigh
  Dim iElem, iSwap, vTemp
  Dim bSwapped, nGap
 
  iLow = LBound(vaData)
  iHigh = UBound(vaData)
  nGap = iHigh
  bSwapped = True
  While bSwapped
    nGap = (nGap * 10) \ 13
    If (nGap < 1) Then
      nGap = 1    
    ElseIf (nGap = 10) Or (nGap = 9) Then
      nGap = 11
    End If
    bSwapped = (nGap <> 1)
    For iElem = iLow To iHigh - nGap
      iSwap = iElem + nGap
      If vaData(iElem) > vaData(iSwap) Then
        vTemp = vaData(iElem)
        vaData(iElem) = vaData(iSwap)
        vaData(iSwap) = vTemp
        bSwapped = True
      End If
    Next
  Wend
End Sub
 
 
gli passi un array monodimensionale ed il codice lo ritorna ordinato,
per ulteriori informazioni sul combsort vedi
 
https://it.wikipedia.org/wiki/Comb_sort
 
 
http://cs.clackamas.cc.or.us/molatore/cs260Spr03/combsort.htm
 
 
ciao
 
 
 
 
 
 
 
 


cut
tutto bene, ancora grazie, ho detto correzioni per intendere 
integrazioni, e trattandosi di un linguaggio che non conosco per me è 
importante la precisione del listato, non mi è così immediato 
ripercorrere tutto il thread.
Inoltre mi attirava la storia dell'array multi dimensionale, visto che 
nel mio PowerBasic tale ordinamento pare un po' farraginoso, mentre nel 
vbscript intravvedo una maggiore elasticità.

 mentre nel vbscript intravvedo una maggiore elasticità.
 
PowerBasic ? Beh, ma dillo subito :)
 
https://rosettacode.org/wiki/Sorting_algorithms/Comb_sort
 
 
considera che il sito 
http://rosettacode.org/wiki/Rosetta_Code
 contiene
una marea di esempi di codice che implementano vari algoritmi in molti
linguaggi; facci un giro, potresti trovarci roba interessante; giusto
come esempio questo è il risultato della ricerca nel sito per "random"
 
http://rosettacode.org/mw/index.php?title=Special%3ASearch&search=random&go=Go
 
 
e questo per "shuffle"
 
http://rosettacode.org/mw/index.php?title=Special%3ASearch&profile=default&search=shuffle&fulltext=Search
 
 
tornando a powerbasic...
 
http://rosettacode.org/mw/index.php?title=Special%3ASearch&search=powerbasic&go=Go
 
 
http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#BASIC
 
 
ciao :)
 
 

 maggiore di quello restante, per cui immaginavo una cosa difficile
 
basta usare un HD esterno (es. USB) per creare l'immagine, dopodichè la
stessa può essere masterizzata su un DVD e messa da parte
 
Per quanto mi rigurda, se ho sottomano un PC nuovo, creo almeno 3
immagini 
 
La prima, avviando il PC da CD/DVD/USB e creando l'immagine del sistema
"ancora da avviare"
 
A seguire, avvio il sistema normalmente, lo attivo (se necessario), poi
procedo alla disinstallazione di tutta l'immondizia preinstallata e ad
una pulizia ammodino, configuro quanto necessario e poi creo una
seconda immagine
 
A questo punto installo il sw "base" che ritengo necessario, configuro
il tutto e creo una terza immagine
 
La prima immagine è utile se per caso dovessi rivendere il computer, in
tal caso, piallo il disco, ripristino la prima immagine ed il computer
è nello stato in cui era quando è stato acquistato
 
Le altre due possono servire a ripristinare il sistema "base" o "base +
sw" ... e fanno comunque comodo :)
 
 
 
 
 


CUTTONE
 
grazie, non preoccuparti, so già tutto, ma non mi sono mai deciso ad 
operare, ma mi sa che è ora

 
https://rosettacode.org/wiki/Sorting_algorithms/Comb_sort
 
 
da anni conosco non solo Rosettacode ma ogni possibile repository di 
snippets del web, spaziando anche in linguaggi che non conosco per 
estrarne lo pseudocodice che possa servirmi in PB.
ma sai beneche tutto questo richiede tempo costanza e dedizione, al 
punto che mi sono venuti alcuni acciacchi fisici da sedentarietà.
 
Inoltre a volte mi capita di perdermi in un bicchierino d'acqua.
Per esempio il tuo combsort è uscito fuori mentre si parlava di cercare 
una serie di files in una cartella. Per cui, in vbscript...come 
collegare, eventualmente i 2 programmi ?.
Se invece io volessi dare in pasto al combsort una serie di miei dati, 
con quale meccanismo e codicillo di scrittura ?
Certo, non conosco il vbscript, ma mi pare di fare una figuraccia.
Ma già mi piace l'idea di non dover sempre aprire l'IDE di PB, è più 
complicato scrivere il cappello di un programma che non il suo 
algoritmo.
Ecco quindi il Vb, che vorrei approfondire, già trovata ieri la guida 
di Tofy.
Eccetera.......

 Ma già mi piace l'idea di non dover sempre aprire l'IDE di PB, è più 
 
Per vbscript, scaricati questo 
http://www.vbsedit.com/
 tra l'altro
permette anche di convertire i vbs in exe; ad ogni modo semplifica
molto la stesura di codice vbs e contiene anche parecchi esempi
 
ciao
 
 

 ciao
 
ah, ecco, bene, grazie

cose fatte di corsa, prima avevo più calma per tutto.
 
Mah, secondo me faresti meglio a togliere in fretta la polvere dal dissipatore.
 
Se è un laptop e non sai come aprirlo, su youtube ci sono molti filmati che
mostrano come agire sui vari modelli.
 
Altrimenti fallo fare ad un riparatore, ma tieni presente che la polvere tende
ad accumularsi di più dove c'è già altra polvere.
 
-- 
ciao
  Stefano

 tende ad accumularsi di più dove c'è già altra polvere.
 
ti ringrazio ancora, proprio anche all'arrivo del caldo devo andare 
subito dal teNNico, ma mi si pone un problema di privacy di una mole di 
dati sensibili, per cui preventivamente cercherò di installare altro HD 
nel portatile, o anche niente, tanto credo che a lui non serva.
E durante il suo lavoro farò una scansione storica AV del HD ferito, ma 
penso che non ci sia niente, incredibilmente ricevo messaggi di 
funzioni bloccate dalla Group Policy, ma quale ? io ho W7 HP.
Invece da 2 gg. mi sto divertendo con il CombSort di ObiWan, che in 
sostanza funziona, ma crea alcuni errori concettuali.
Sto cercando di ovviare.

 operare, ma mi sa che è ora
 
Quando ti sarai deciso, come ultima possibilità prima fai un
 "upgrade in place":
 
https://support.microsoft.com/en-us/help/2255099/how-to-perform-an
 
-in-place-upgrade-on-windows-vista-windows-7-windows
 
Poi ti toccherà probabilmente rifare un po' di aggiornamenti e
 qualche ottimizzazione
e/o personalizzazione, ma non dovrebbe toccare né dati né programmi.
 
Bye, G.
 
 
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
 

 ovviare.
 
Non ho capito a quali "errori concettuali" tu ti riferisca, l'algoritmo
del combsort (nel caso in questione del comsort11) è noto da tempo 
 
https://en.wikipedia.org/wiki/Comb_sort
 
 
http://cs.clackamas.cc.or.us/molatore/cs260Spr03/combsort.htm
 
 
e non mi sembra abbia "errori concettuali"; potresti spiegarti meglio ?
 
 
 

 e non mi sembra abbia "errori concettuali"; potresti spiegarti meglio ?
 
mi scuso, forse "concettuale" è troppo, ma ci sono alcune sbavature, di 
cui una conosciuta.
quando il programma apre un file di 100 record sa che ne sono 100 ma li 
numera da 0 a 99, credo.
Tuttavia per rifarsi comunica di dover gestire N + 1 record = 
101,(UBound(vaData) + 1), ma è un'ipotesi incerta perchè il "+1" 
dovrebbe dare 100 se sommato a 99, quindi lui sa da subito che ne sono 
100 ma forse conta da 0.
Ecco, bisognerebbe raccordare le cose.
Se almeno io fossi padrone del Vbscript....mi tocca studiare subito il 
Replace, lo Split e il Join.
Quando poi salva i record ordinati comunica di averne salvati 101, 
coerentemente, ma non è vero perchè in realtà i record sono 100.
Andando a esaminare il salvato si nota che nell'elaborazione è stato 
creato un record costante di troppo, fatto di 2 caratteri: 0D 0A, cioè 
il ritorno a capo. E infatti il file salvato ha 2 bytes in più, che non 
dovrebbe avere.questo record fantasma, ovviamente, per la logica 
dell'ordinamento capita sempre come primo record.
E se invece capitasse nel frammezzo ? hai voglia a ritrovarlo.
Non sono ancora riuscito a escogitare come evitare il vbCrLf iniziale 
di troppo.
Il contegggio del tempo è cosa ottima, ma perchè bisogna farsi dire il 
tempo solo se maggiore di 0 ?
allora ho tolto la condizione, ma i tempi risultano sempre negativi.
Motivo ? la sintassi non deve essere "DateDiff("s", dtEnd, dtStart)", 
come sarebbe peraltro concettualmente logico, ma "DateDiff("s", 
dtStart, dtEnd)"
Ho corretto in base all'help.
Tuttavia il programmino mi piace molto, facile anche da aggiornare, e 
comodo anche da rendere EXE.
----------
Già che ci sono ti segnalerei che nel primo file che hai dato al 
Giampaolo per ordinare le sue cose, il tuo prog Scanfiles stabiliva 
come separatore il tab. L'ho sostituito col semplice ";"ma non ha 
funzionato, forse devo prendere la lente d'ingrandimento per trovare il 
bandolino della matassa, cmq ho lasciato perdere.
Grazie dell'attenzione, ciao.

 di cui una conosciuta. quando il programma apre un file di 100 record
 
Si ok, ho aggiunto alcuni pezzi di codice "come un ripensamento", dopo
aver scritto e testato il tutto, quindi è possibile che ci possano
essere dei bug secondari che, comunque, non mi sembra abbiano effetti
sul funzionamento vero e proprio del programma; ciò detto, nessuno ti
vieta di correggere quelle due o tre sviste, il codice lo hai :)
 
 

Finalmente posso relazionarti sul risultato:
 
dopo aver capito come modificare il file scanfile.vbs iniziale posso dirti 
che il tutto funziona esattamente come previsto.
 
Bravissimo, davvero.
 
Mille ringraziamenti Obiwan, sei stato gentilissimo nei miei confronti.
 
P.S. - Don't worry se scanfiles.vbs non è ottimizzato per la massima 
velocità ottenibile, 4-5 secondi per volta posso anche aspettarli  per un 
record di 1200 file :-)
Del resto uso un HP quad core 2,4 mega con 3 giga di ram . Quindi abbastanza 
veloce di suo :-)

Finalmente posso relazionarti sul risultato:
 
dopo aver capito come modificare il file scanfile.vbs iniziale posso dirti 
che il tutto funziona esattamente come previsto da te.
 
Bravissimo, davvero.
 
Mille ringraziamenti Obiwan, sei stato gentilissimo nei miei confronti.
 
P.S. - Don't worry se scanfiles.vbs non è ottimizzato per la massima 
velocità ottenibile, 4-5 secondi per volta posso anche aspettarli  per un 
record di 1200 file :-)
Del resto uso un HP quad core 2,4 mega con 3 giga di ram . Quindi abbastanza 
veloce di suo :-)
 
-- 
Giampaolo Natali
giampaol...@alice.it
 
 

 per un record di 1200 file :-) 
 
Ah sono solo 1200 ? Avevo capito fossero molti di più (10 o 100 volte
di più) per quello ho parlato di ottimizzazione
 
Ad ogni modo, se il percorso da "indicizzare" è sempre lo stesso
potresti semplificarti la vita creando un file "batch" per avviare il
"vbs", in breve, supponendo che il "vbs" sia in "c:\scanfiles", il tuo
batch potrebbe essere qualcosa del tipo
 
@echo off
pushd c:\scanfiles
cscript //nologo scanfiles.vbs n:\gpl\video
copy filelist.txt filelist.csv
start filelist.csv
popd
exit
 
ti basterà salvare il batch nella cartella c:\scanfiles insieme con lo
script scanfiles.vbs e poi creare un collegamento al batch sul desktop
(o dove preferisci), facendo doppio click sul batch avvierai lo script
che creerà l'indice, a quel punto il batch copierà l'indice in un file
"csv" e lancerà excel aprendo tale file
 
ciao
 

 ciao
 
-- 
Giampaolo Natali
giampaol...@alice.it