2009-07-26 9 views
10

Sto tentando di utilizzare un file batch per elencare i file in una directory in modo che solo il nome file (meno l'estensione) corrisponda solo ai modelli numerici, ad es. qualcosa come 125646543.pdf che sarebbe facile da esprimere come regex [\ d] + \. pdf ma ovviamente non ho simili sottigliezze con meccanismi solo per Windows ... Sto provando a farlo con Windows- solo meccanismi dal momento che non posso installare altro sui server di destinazione, e deve essere supportato almeno su Windows Server 2000 e 2003.Corrispondenza file avanzata di Windows

Prenderò una soluzione specifica per questo particolare esempio o qualcosa di più generico che ha qualcosa più avanzato di solo voi vecchi e?

Ho già provato a lavorare con set/a per aggiungere un numero al nome del file, ma poiché interpreta le stringhe come variabili di ambiente e 0 se non sono definite, questo non funziona bene. Ho anche provato a utilizzare if %% ~ na GTR 0, ma corrisponde anche a nomi di file di testo come report.pdf, poiché in questo caso sembra eseguire un confronto tra stringhe.

+1

Sono abbastanza certo questo non appartiene a serverfault. Cmd.exe potrebbe aver avuto un brutto brutto nei suoi primi giorni (morti nel cervello) ma era ancora in programmazione anche allora. E il moderno cmd.exe è molto più potente al giorno d'oggi. È tanto legato alla programmazione quanto agli script di bash. – paxdiablo

risposta

21

findstr può fare regex in Windows bene. Mi piacerebbe provare:

dir /b | findstr /i "^[0-9][0-9]*\.pdf$" 

Il "dir /b" ti dà solo i nomi dei file, uno per riga. L'espressione regolare corrisponde a una o più cifre seguite da un periodo seguito dall'estensione desiderata. Per qualsiasi estensione, si potrebbe fare:

dir /b | findstr "^[0-9][0-9]*\.[^\.]*$" 

Ovviamente, se ci sono altri casi più complicati, è possibile regolare l'espressione regolare per adattarsi. Non ha la piena potenza di UNIX regex, ma è abbastanza buono.

Il seguente file di comando mostra come è possibile elaborare ciascun file PDF nella directory corrente che soddisfa il requisito "tutto numerico".

@echo off 
setlocal enableextensions enabledelayedexpansion 
for /f "usebackq" %%i in (`dir /b ^| findstr /i "^[0-9][0-9]*\.PDF$"`) do (
    set fspec=%%i 
    echo.Processing !fspec! 
) 
endlocal 

Il sito http://www.robvanderwoude.com/batchfiles.php è un'ottima risorsa per magic file CMD (e molte altre cose).

+0

L'espressione regolare nel primo esempio può essere semplificata se si utilizza l'opzione '/ i' per eseguire una ricerca senza distinzione tra maiuscole e minuscole:' findstr/i "^ [0-9] [0-9] * \. Pdf $" ' . – Helen

+0

Esattamente quello che stavo cercando. Non posso credere di aver perso findstr! Grazie mille. – HerbCSO

2

windows ha fornito uno strumento di programmazione migliorato da win98. Si chiama vbscript.

Set objFS = CreateObject("Scripting.FileSystemObject") 
strFolder = "c:\test" 
Set objFolder = objFS.GetFolder(strFolder) 
For Each strFile In objFolder.Files 
    strFileName = strFile.Name 
    strExtension = objFS.GetExtensionName(strFile) 
    strBase = objFS.GetBaseName(strFile) 
    If IsNumeric(strBase) Then 'check if numeric 
     WScript.Echo strBase 
      'continue to process file here....... 
    End If 
Next 

per ulteriori informazioni su VBScript, leggere il manual

+0

Hai assolutamente ragione, ma ho incontrato un certo numero di ambienti aziendali in cui hanno disabilitato VBScript/JScript perché era considerato non sicuro (sia che fosse giusto o meno) quindi preferisco il suggerimento di Pax. Grazie mille per il suggerimento però! – HerbCSO

+1

sono sicuri solo quanto le persone che li usano. con i controlli appropriati, ovvero consentire agli utenti autorizzati le autorizzazioni corrette, l'uso di vbscript non fa differenza rispetto all'utilizzo di batch. – ghostdog74

+3

Sono assolutamente d'accordo, ma non faccio le politiche di sicurezza e le persone che lo fanno non la vedono necessariamente allo stesso modo. ;] – HerbCSO