2016-03-24 11 views
7

Ho una regex che sto utilizzando (solo in prova) per aggiornare AssemblyVersion dal file AssemblyInfo.cs. Mi chiedo, tuttavia, quale sarebbe il modo migliore per estrarre e sostituire questo valore dal file .cs stesso?Recupera e sostituisci AssemblyVersion da AssemblyInfo.cs

Ecco la mia ipotesi migliore che, ovviamente, non funziona, ma l'idea generale è a posto. Speravo in qualcosa di un po 'più elegante.

Get-Content $file | Foreach-Object{ 
    $var = $_ 
    if($var -contains "AssemblyVersion"){ 
     $temp = [regex]::match($s, '"([^"]+)"').Groups[1].Value.Substring(0, $prog.LastIndexOf(".")+1) + 1234 
     $var = $var.SubString(0, $var.FirstIndexOf('"') + $temp + $var.SubString($var.LastIndexOf('"'), $var.Length-1)) 
    } 
} 

EDIT

Per richiesta Ecco la linea che sto cercando di aggiornare nel AssemblyInfo:

[assembly: AssemblyVersion("1.0.0.0")] 
+0

Aggiunta la riga 'AssemblyVersion' al post – NealR

risposta

15

Non proprio l'intenzione di modificare la regex ma volendo mostrare la flusso di ciò che si potrebbe provare.

$path = "C:\temp\test.txt" 
$pattern = '\[assembly: AssemblyVersion\("(.*)"\)\]' 
(Get-Content $path) | ForEach-Object{ 
    if($_ -match $pattern){ 
     # We have found the matching line 
     # Edit the version number and put back. 
     $fileVersion = [version]$matches[1] 
     $newVersion = "{0}.{1}.{2}.{3}" -f $fileVersion.Major, $fileVersion.Minor, $fileVersion.Build, ($fileVersion.Revision + 1) 
     '[assembly: AssemblyVersion("{0}")]' -f $newVersion 
    } else { 
     # Output line as is 
     $_ 
    } 
} | Set-Content $path 

Run per ogni linea e controllare per vedere se la linea di corrispondenza è lì. Quando viene trovata una corrispondenza, la versione viene archiviata come tipo [version]. Usando questo aggiorniamo la versione secondo necessità. Quindi emettere la riga aggiornata. Le linee non corrispondenti sono appena emesse così come sono.

Il file viene letto e poiché è tra parentesi l'handle viene chiuso prima che la pipeline inizi a elaborare. Questo ci permette di riscrivere lo stesso file. Ogni passaggio nel ciclo restituisce una riga che viene quindi inviata a set-content per riscrivere il file.


Nota che $var -contains "AssemblyVersion" non avrebbe funzionato come previsto come -contains è un operatore array. -match sarebbe preferibile purché si sappia che è un operatore di supporto all'espressione regolare, quindi fai attenzione ai meta-caratteri. -like "*AssemblyVersion*" funzionerebbe anche e supporta semplici caratteri jolly.

+1

Wow, questo è perfetto. Non ero a conoscenza che PowerShell avesse specificamente accesso alle versioni di file Major/Minor etc. Grazie!!! – NealR

+0

@NealR Questo deriva in parte da un'altra mia risposta: http://stackoverflow.com/questions/30195025/increment-version-in-a-text-file/30195294#30195294. Solo il ripristino è il tipo ha proprietà di sola lettura. – Matt

+0

Ottima risposta, grazie. Ho apportato alcune modifiche che risolvono alcuni problemi in cui mi sono imbattuto in [gist] (https://gist.github.com/blakeja/5655fe2ac52ff26fdec9ffa481c18dd9). In particolare, aggiungendo ancore di inizio/fine alla regex, gestire le versioni che usano il carattere *, leggere/scrivere il file con la codifica UTF-8 specificata in modo esplicito. –