Domanda

Qualcuno ha uno script PowerShell pratico che ottiene un insieme di file da TFS sulla base di una data di modifica ? Mi piacerebbe dire "dammi tutti i file in questa cartella (o sottocartella) che sono stati modificati dopo l'X / Y / ZZZZ" e discarica i file in una cartella diversa dalla cartella che normalmente andare. Ne so abbastanza PowerShell per incidere su e ottenere questo fatto, alla fine, ma spero di evitarlo.

È stato utile?

Soluzione

Assicurarsi di avere le Team Foundation 2015 Power Tools installati. Viene fornito con uno snap-in PowerShell. È possibile eseguire il file della console PowerShell fin dal suo gruppo di avvio o è possibile eseguire Add-PSSnapin Microsoft.TeamFoundation.PowerShell. Poi cd per l'area di lavoro ed eseguire:

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       

Per scaricare queste informazioni a una directory:

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

Per copiare i file in un'altra dir (questo presuppone li hai tirato giù a livello locale in una workfolder):

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

Nota: questo copia i file in una struttura di cartelle piatta. Se si vuole mantenere la struttura dir è un po 'più complesso.

Altri suggerimenti

Utilizzando Get-TfsItemProperty come Keith non solo richiede uno spazio di lavoro per le copie dei file. E 'il wrapper per GetExtendedItems (), la query server per info locale più comunemente visto in Esplora controllo codice sorgente. Facendo affidamento sulla informazioni sulla versione si riferisce, si assume i file stessi sono stati scaricati (più in generale: sincronizzati , nel caso di rinomina e cancella) negli ultimi 30 giorni. Se l'area di lavoro, non è aggiornato, vi perderete alcuni file / dare loro i nomi di out-of-date / ecc E 'anche piuttosto costoso come comandi informativi vanno.

Alcuni esempi alternativi:

# 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

Il primo è un semplice adattamento del codice di Keith, utilizzando una query più economico ed eliminando la dipendenza di lavoro. E 'la migliore opzione se si conosce un alto% degli elementi sotto che dir sono stati modificati di recente.

La seconda opzione interroga direttamente la storia di modifiche. Lasciando la clausola Dove essere calcolato in SQL invece che sul client, questo può essere un ordine di grandezza più efficiente se una bassa% degli articoli sono stati modificati di recente (come spesso accade). Tuttavia, sarà ritardo le query elemento-base se ci sono un sacco di grandi gruppi di modifiche restituito, rendendo il server si uniscono per afferrare le proprietà degli elementi costosi e costringendo il nostro rimozione duplicati sul lato client per fare un sacco di lavoro.

[sì, lo so che avere -Version richiede una stringa non è molto PowerShell-esque; colpa mia. potrebbero creare un DateVersionSpec con il nuovo oggetto e chiamare il ToString (), ma questo è ancora di più il lavoro.]

non ha mostrato tutte le combinazioni di API chiamata + attività desiderata. Va da sè è possibile utilizzare 1 # per generare l'elenco dei file e # 2 di (ri) scaricare modificando la seconda metà del gasdotto. È anche possibile combinare questa tecnica copia con l'efficienza di 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

E 'vero questo fa un 2 ° di andata e ritorno al server, ma grazie alla query iniziale le GetExtendedItems () chiamata verrà ambito alla precisa serie di articoli che ci interessa. E naturalmente abbiamo eliminare ogni possibilità che scaricare tempo diventa il collo di bottiglia. Questa è probabilmente la migliore soluzione di tutti quando il # di changeset è piccolo e le preoccupazioni che ho sollevato sulla sincronizzazione di lavoro di Keith non sono rilevanti per qualsiasi motivo.

  

Posso solo dire che dover PowerShell all'utente di fare questo sembra assurdo.

FWIW, sono stato coinvolto con TFS dall'interno e dall'esterno MS per 4.5yr e mai visto questa funzione richiesta. Se si potesse espandere su ciò che l'obiettivo si sta effettivamente cercando di realizzare, la mia ipotesi è che potremmo suggerire un modo migliore. Non fraintendetemi, ho scritto le estensioni Powershell proprio per gestire gli scenari stravaganti come questo. Ma spesso si tratta di un lavoro per un altro strumento del tutto, ad esempio: Annotazione, MSBuild, schema DB confrontare ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top