obtener un conjunto de archivos que han sido modificados después de una fecha determinada

StackOverflow https://stackoverflow.com/questions/1528806

  •  20-09-2019
  •  | 
  •  

Pregunta

¿Alguien tiene un práctico script de powershell que se presenta un conjunto de archivos de TFS basado en una fecha de modificación?Me gustaría decir "dame todos los archivos en esta carpeta o subcarpeta) que fueron modificadas después de X/Y/ZZZZ" y volcado de los archivos a una carpeta distinta de la carpeta en que se irían normalmente.Sé lo suficiente de powershell para hackear y obtener este hecho, con el tiempo, pero tengo la esperanza de evitar que.

¿Fue útil?

Solución

Asegúrese de que tiene la El Equipo De La Fundación 2015 Herramientas De Poder instalado.Viene con un PowerShell complemento.Puede ejecutar la consola de PowerShell de archivo a la derecha de su grupo de inicio o puede ejecutar Add-PSSnapin de Microsoft.TeamFoundation.PowerShell.Luego de cd a su área de trabajo y ejecutar:

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    Format-Table CheckinDate,TargetServerItem -auto

CheckinDate           TargetServerItem 
-----------           ----------------
9/14/2009 1:29:23 PM  $/Foo/Trunk/Bar.sln                            
9/29/2009 5:08:26 PM  $/Foo/Trunk/Baz.sln       

Para volcar esa información a un dir:

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    Select TargetServerItem > c:\recentlyChangedFiles.txt

Para copiar los archivos a otro dir (esto asume que usted tiene de ellos tira hacia abajo de forma local en un workfolder):

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    CopyItem -Path $_.LocalItem -Destination C:\SomeDir -Whatif

Nota: esta copia los archivos en una carpeta normal de la estructura.Si desea mantener la estructura de directorios es un poco más complicado.

Otros consejos

El uso de Get-TfsItemProperty como Keith no solo requieren de un espacio de trabajo para el archivo de copia.Es el contenedor para GetExtendedItems(), el servidor de consultas de información local más comúnmente visto en el Explorador de Control de código Fuente.Basándose en la información de versión de que los informes, usted asume los propios archivos descargados (de manera más general: sincronizado, en el caso de que se cambia el nombre de & eliminaciones) en los últimos 30 días.Si el área de trabajo no está al día, vas a perder algunos archivos / darles fuera de fecha, los nombres de / etc.También es bastante caro como informativos comandos ir.

Algunos alternativa ejemplos:

# 1
Get-TfsChildItem $/FilesYouWant -R | 
    ? { $_.CheckinDate -gt (Get-Date).AddDays(-30) } | 
    % { $_.DownloadFile(join-path C:\SomeDir (split-path $_.ServerItem -leaf)) }

# 2
Get-TfsItemHistory $/FilesYouWant -R -All -Version "D$((Get-Date).AddDays(-30).ToString('d'))~" |
    Select-TfsItem |
    Select -Unique -Expand Path |
    Sort |
    Out-File c:\RecentlyChanged.txt

La primera es una simple adaptación de Keith del código, mediante una más barata de consulta y eliminando el espacio de trabajo de la dependencia.Es la mejor opción si usted sabe que un alto porcentaje de los elementos en virtud de que dir fueron modificados recientemente.

La segunda opción consultas del conjunto de la historia directamente.Por dejar que la cláusula where se calcula en SQL en lugar de en el cliente, este puede ser un orden de magnitud más eficiente si un bajo % de los artículos se han cambiado recientemente (como es a menudo el caso).Sin embargo, lag el elemento de consultas de base de si hay un montón de grandes conjuntos de cambios devuelto, haciendo que el servidor se UNEN para agarrar las propiedades del elemento caro y obligar a nuestros clientes lado eliminación de duplicados para hacer un montón de trabajo.

[Sí, sé que en la Versión requieren una cadena no es muy Powershell-esque;mea culpa.Usted podría crear un DateVersionSpec con el nuevo objeto y llamar a su método ToString(), pero eso es aún más trabajo.]

No me muestran cada combinación de llamada a la API + tarea deseada.Va sin decir que usted puede utilizar #1 para generar el archivo de la lista y #2 a (re)descargar por la modificación de la segunda mitad de la tubería.Usted puede incluso combinar que copiar la técnica con la eficiencia de Get-TfsItemHistory:

# 2b, with local-to-local copying
Get-TfsItemHistory $/FilesYouWant -R -All -Version "D$((Get-Date).AddDays(-30).ToString('d'))~" | 
    Select-TfsItem |
    Select -Unique -Expand Path |
    Get-TfsItemProperty | 
    Copy $_.LocalItem -Dest C:\SomeDir

Es cierto que esta hace un 2º viaje de ida y vuelta al servidor, pero gracias a la consulta inicial de la GetExtendedItems() llamada será el ámbito para el conjunto de los elementos que nos interesa.Y por supuesto que eliminar cualquier posibilidad de que el tiempo de descarga se convierte en un cuello de botella.Esta es probablemente la mejor solución de todos cuando el número de conjuntos de cambios es pequeña y las preocupaciones planteadas acerca de Keith sincronización del área de trabajo no son relevantes por el motivo que sea.

Puedo decir que el tener a usuario powershell para hacer esto, parece absurdo.

FWIW, he estado involucrado con la TFS de dentro y fuera de MS de 4.5 años y nunca había visto esta característica solicitada.Si pudieras ampliar lo meta en realidad estás tratando de lograr, mi conjetura es que podría sugerir una mejor manera.No me malinterpreten, me escribió el Powershell extensiones precisamente para "bicho raro" situaciones como esta.Pero con frecuencia es un trabajo para otra herramienta completamente, por ejemplo:Anotar, MSBuild, DB comparación de esquemas...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top