2014-06-06 25 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" 
相关问题