2014-06-06 51 views
0

大家好,我正在使用PowerShell使用內部版本號替換一些cacheBuster值的構建腳本。使用PowerShell替換字符後的文本

我得到了一個基本的字符串與內部版本號工作正常。但是,當文件沒有更新時,它不會從svn中清除乾淨,所以我的匹配參數不再有效。

到目前爲止,我的代碼是這樣

JS文件

"deps": ["app"], 
    "name": "app", 
    "urlArgs": "bust=", 
    "waitSeconds" : 60, 
    "catchError": { 
     "define": true 
    } 

PowerShell腳本

$path = "jsmin\config.js" 
$word = "bust=" 
$replacement = $build 
$text = get-content $path 
$newText = $text -replace $word,$replacement 
$newText > $path 

我想這樣做來解決這個問題是尋找什麼像bust = buildnumber這樣的變量,然後用buildNumber替換bust =之後的所有文本。我假設我需要一個正則表達式來做到這一點,但不確定如何。

任何幫助將是巨大的

回答

2

你可以試試這個:

$path = "jsmin\config.js" 
$word = "bust=" 
$text = Get-Content $path 
$text -replace ("(?<=$word)" +'(.*?)(?=")'), $build | Set-Content $path 
+0

感謝您的回覆,多數民衆贊成關閉它並更換了正確的區域,但它增加了編譯後半身後擦拭文件的其餘部分= 292929 –

+0

它有一個錯誤,因爲它最後刪除'」, '但是如果它擦除了其餘的文本,那麼你的js文件是單行而不是像你的示例那樣是多行的。嘗試更新的答案 –

+0

是的,這正是我在minifed文件上運行的問題。太好了謝謝。 –

0

可行的替代方案。如果您使用的是具有Convert [To | From] -Json的PowerShell版本,則可以將Json轉換爲PowerShell對象,獲取屬性名稱,檢查值,更新目標並將PS Object轉換回Json。

比正則表達式更冗長和更慢,但是是一個選項。

$build=(Get-Date).ToString("yyyyMMddhhmmss") 

$js = @" 
{ 
"deps": ["app"], 
    "name": "app", 
    "urlArgs": "bust=", 
    "waitSeconds" : 60, 
    "catchError": { 
     "define": true 
    } 
} 
"@ | ConvertFrom-Json 

$pn = ($js | Get-Member -MemberType *Property).Name 

$pn | % { 
    if($js.$PSItem -match "^bust=") 
    { 
     $js.$PSItem="bust=$build" 
    } 
} 

$js | ConvertTo-Json # > "config.js" 
相關問題