2009-07-26 9 views
10

Estoy tratando de usar un archivo por lotes para listar archivos en un directorio de modo que el nombre del archivo solamente (menos la extensión) coincida solo con patrones numéricos, p. Ej. algo así como 125646543.pdf que sería fácil de expresar como una expresión regular [\ d] + \. pdf pero por supuesto no tengo esas sutilezas con mecanismos solo de Windows ... Estoy tratando de hacer esto con Windows- solo mecanismos ya que no puedo instalar nada más en los servidores de destino, y debe ser compatible al menos en Windows Server 2000 y 2003.Archivo avanzado de Windows que coincide

Tomaré una solución específica para este ejemplo en particular o algo más genérico que tenga algo más avanzado que solo el antiguo * y?

Ya he intentado trabajar con set/a para agregar un número al nombre del archivo, pero como interpreta las cadenas como variables de entorno y 0 si no están definidas, esto no funciona bien. También intenté usar if %% ~ na GTR 0, pero eso también coincide con los nombres de los archivos de texto, como report.pdf, ya que parece que hace una comparación de cadenas en este caso.

+1

estoy bastante seguro de que esto no pertenece a serverfault. Cmd.exe puede haber recibido una mala reputación en sus primeros días (muerte cerebral) pero aún así estaba programando incluso entonces. Y el cmd.exe moderno es mucho más poderoso hoy en día. Es tanta programación relacionada como scripts bash. – paxdiablo

Respuesta

21

findstr puede hacer expresiones regulares bajo Windows muy bien. Me gustaría probar:

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

El "dir /b" le da sólo los nombres de archivo, uno por línea. La expresión regular coincide con uno o más dígitos seguidos de un período seguido de la extensión que desee. Para cualquier extensión, que podría hacer:

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

Obviamente, si hay otros casos más complicados, se puede ajustar la expresión regular para que se adapte. No tiene todo el poder de las expresiones regulares de UNIX, pero es razonablemente bueno.

El siguiente archivo de comando muestra cómo puede procesar cada archivo pdf en el directorio actual que cumpla con su requisito "totalmente numérico".

@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 

El sitio http://www.robvanderwoude.com/batchfiles.php es un recurso muy bueno para CMD magia archivo (y muchas cosas más).

+0

La expresión regular en el primer ejemplo se puede simplificar si usa el interruptor '/ i' para realizar una búsqueda que no distingue entre mayúsculas y minúsculas:' findstr/i "^ [0-9] [0-9] * \. Pdf $" ' . – Helen

+0

Exactamente lo que estaba buscando. No puedo creer que me haya perdido FindStr! Muchas gracias. – HerbCSO

2

windows le han proporcionado una herramienta de programación mejorada desde win98. Se llama 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 

para más información sobre VBScript, lea el manual

+0

Tiene toda la razón, pero he encontrado una serie de entornos corporativos en los que deshabilitaron VBScript/JScript porque se consideró inseguro (con razón o no), por lo que prefiero la sugerencia de Pax. ¡Muchas gracias por la sugerencia! – HerbCSO

+1

son tan seguros como las personas que los usan. con los controles adecuados, es decir, permitiendo a los usuarios autorizados los permisos correctos, usar vbscript no es diferente de usar lotes. – ghostdog74

+3

Estoy totalmente de acuerdo, pero no hago las políticas de seguridad y las personas que sí lo hacen no necesariamente lo ven de la misma manera. ;] – HerbCSO

Cuestiones relacionadas