2009-07-26 33 views
10

Próbuję użyć pliku wsadowego do wyświetlenia listy plików w katalogu, tak aby nazwa pliku (minus rozszerzenie) była zgodna tylko z wzorcami numerycznymi, np. coś podobnego do 125646543.pdf, które byłoby łatwe do wyrażenia jako regex [\ d] + \. pdf ale oczywiście nie mam takich nicetek z mechanizmami tylko Windows ... Próbuję to zrobić z Windows- tylko mechanizmy, ponieważ nie mogę zainstalować niczego innego na serwerach docelowych i musi on być obsługiwany przynajmniej w systemach Windows Server 2000 i 2003.Zaawansowane wyszukiwanie plików systemu Windows

Podejmę konkretne rozwiązanie dla tego konkretnego przykładu lub coś bardziej ogólnego, które ma coś bardziej zaawansowany niż tylko starcy * i?

Próbowałem już pracować z zestawem/a, aby dodać numer do nazwy pliku, ale ponieważ interpretuje łańcuchy jako zmienne środowiskowe i 0, jeśli nie są zdefiniowane, to nie działa dobrze. Próbowałem również użyć, jeśli %% ~ na GTR 0, ale że pasuje również do nazw plików tekstowych, takich jak report.pdf, ponieważ wydaje się, że w tym przypadku dokonuje się porównania łańcuchów.

+1

Jestem całkiem pewien, że to nie należy na ServerFault. Program Cmd.exe mógł dostać złego rapu w jego wczesnych (mózg-martwych) dniach, ale wciąż był programowany nawet wtedy. Współczesny cmd.exe jest teraz znacznie bardziej wydajny. To tyle programowania, co skrypty bash. – paxdiablo

Odpowiedz

21

findstr można zrobić wyrównywania w systemie Windows, dobrze. Chciałbym spróbować:

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

"dir /b" daje tylko nazwy plików, po jednym w każdym wierszu. Wyrażenie regularne dopasowuje jedną lub więcej cyfr, po których następuje kropka i żądane rozszerzenie. Dla każdego rozszerzenia, można zrobić:

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

Oczywiście, jeśli istnieją inne przypadki bardziej skomplikowane, można dostosować do własnych regex. Nie ma pełnej mocy wyrażeń regularnych w systemie UNIX, ale jest dość dobry.

Poniższy plik poleceń pokazuje, w jaki sposób można przetworzyć każdy plik pdf w bieżącym katalogu spełniający wymagania "całkowicie numeryczne".

@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 

Witryna http://www.robvanderwoude.com/batchfiles.php jest bardzo dobrym źródłem informacji dla CMD plików magii (i wiele innych rzeczy).

+0

Wyrażenie regularne w pierwszym przykładzie może zostać uproszczone, jeśli użyjesz przełącznika '/ i' do wykonania wyszukiwania niewrażliwego na wielkość liter:' findstr/i '^ [0-9] [0-9] * \. Pdf $ "' . – Helen

+0

Dokładnie tego, czego szukałem. Nie mogę uwierzyć, że tęskniłem za findstr! Dzięki wielkie. – HerbCSO

2

Okna mają udoskonalone narzędzie do programowania od wersji Win98. Nazywa się 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 

Więcej informacji na temat VBScript, czytać manual

+0

Masz całkowitą rację, ale spotkałem się z wieloma środowiskami korporacyjnymi, w których wyłączyli VBScript/JScript, ponieważ uznano, że jest niestabilny (bez względu na to, czy tak, czy nie), więc wolę sugestię Pax. Wielkie dzięki za sugestię! – HerbCSO

+1

są tak bezpieczne, jak ludzie, którzy ich używają. przy odpowiednich kontrolach, tj. zezwalaniu uprawnionym użytkownikom na prawidłowe uprawnienia, używanie vbscript nie stanowi żadnej różnicy, niż użycie partii. – ghostdog74

+3

Całkowicie się zgadzam, ale nie robię polityki bezpieczeństwa, a ludzie, którzy to robią niekoniecznie widzą to samo. ;] – HerbCSO

Powiązane problemy