Básicamente quiero correr:
C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s
Sé xcopy
que no admite búsquedas de nombre de archivo de expresión regular.
no puedo averiguar cómo averiguar si PowerShell tiene Cmdlet
que copiar archivos; y si es así, cómo averiguar si es compatible con la coincidencia de nombre de archivo de expresión regular.
¿Alguien puede pensar en una forma de realizar una copia / movimiento recursivo de archivos con coincidencia de nombre de archivo regex?
windows
file-management
regex
xcopy
Ian Boyd
fuente
fuente
Respuestas:
Me gusta usar todos los comandos de Powershell cuando puedo. Después de un poco de prueba, esto es lo mejor que puedo hacer.
Las primeras tres líneas son solo para que sea más fácil de leer, puede definir las variables dentro de los comandos reales si lo desea. La clave de este ejemplo de código es el comando "Where-Object", que es un filtro que acepta la coincidencia de expresiones regulares. Cabe señalar que el soporte de expresiones regulares es un poco extraño. Encontré una tarjeta de referencia en PDF aquí que tiene los caracteres admitidos en el lado izquierdo.
[EDITAR]
Como mencionó "@Johannes Rössel", también puede reducir las dos últimas líneas a una sola.
La principal diferencia es que la manera de Johannes hace el filtrado de objetos y mi forma de hacer el filtrado de texto. Cuando se trabaja con Powershell, casi siempre es mejor usar objetos.
[EDIT2]
Como @smoknheap mencionó, los scripts anteriores aplanarán la estructura de carpetas y colocarán todos sus archivos en una carpeta. No estoy seguro de si hay un interruptor que conserve la estructura de la carpeta. Intenté el interruptor -Recurse y no ayuda. La única forma de hacer que esto funcione es volver a la manipulación de cadenas y agregar carpetas a mi filtro.
Estoy seguro de que hay una forma más elegante de hacer esto, pero desde mis pruebas funciona. Reúne todo y luego filtra tanto las coincidencias de nombres como los objetos de carpeta. Tuve que usar el método ToString () para obtener acceso a la manipulación de cadenas.
[EDITAR3]
Ahora, si desea informar la ruta para asegurarse de tener todo correcto. Puede usar el comando "Write-Host". Aquí está el código que le dará algunas pistas sobre lo que está sucediendo.
Esto debería devolver las cadenas relevantes. Si no obtiene nada en alguna parte, sabrá con qué artículo está teniendo problemas.
Espero que esto ayude
fuente
$item.FullName
allí: la propiedad apropiada se toma automáticamente si pasa un objeto FileInfo (en mi opinión, no debería, ya que el poder de PowerShell proviene de pasar objetos estructurados, no cadenas). Además, puede poner todo en una sola tubería:((gci $source) -match $filter) | cp -dest $destination
(ligeramente adaptado para brevedad, no dude en cambiar; solo digo que noforeach
es necesario allí).Copy-Item : Cannot bind argument to parameter 'Path' because it is null
Trim
no está destinado a eliminar una cadena del final de otra cadena, sino que elimina todas las instancias de los caracteres en la cadena de parámetros desde el principio y el final de la cadena en la que se invoca. En su caso, si$item.Name
contiene una C mayúscula, también eliminará la letra de unidad C desde el comienzo de la cadena.PowerShell es una excelente herramienta para esa tarea. Puede usar el cmdlet Copy-Item para el proceso de copia. Puede canalizarlo con otros cmdlets para comandos de copia complejos, aquí hay alguien que hizo exactamente eso :)
Las expresiones regulares usan la clase .NET RegEx del espacio de nombres System.Text.RegularExpressions, hay instrucciones rápidas sobre estas clases
PowerShell también tiene los operadores -match y -replace que se pueden usar al canalizar con copy-item
También hay herramientas para ayudarlo a crear el propio RegEx, por ejemplo, amigo de RegEx
fuente
-match
y-replace
debería mencionarse antes de entrarSystem.Text.RegularExpressions.RegEx
. Al menos para mí, rara vez lo uso[regex]
directamente; sin embargo , uso con frecuencia los operadores-match
y-replace
. En cuanto a la creación de expresiones regulares, descubrí que PowerShell también es bastante útil para probar y refinar una expresión regular que está escribiendo.como una idea pero necesita algo de trabajo
dir -r | ? {$ _ -match '[0-9] {13} \. (gif | jpg | png)'} | % {xcopy $ _. fullname c: \ temp}
fuente