2017-08-09 150 views
2

我正在尝试查找字符串并添加程序所需的字符串。查找并替换多行字符串

我需要代码来看看action = run fast是否已经存在,如果是的话,什么也不做。

$Input = GetContent "${Env:ProgramFiles}\myprogram\file.conf" 

$replace = @" 
[MyAction_Log] 
action = run fast 
"@ 

$Input -replace ('action = run fast') -replace ('\[MyAction_Log\]',$replace) | set-content "${Env:ProgramFiles}\myprogram\file.conf" 

回答

1

的替代这是能够应付的操作键被任何位置在[MyAction_Log]部分

$Inside = $False 
$Modified = $False 
$Path = "$($env:ProgramFiles)\prog\file.conf" 

$NewLines = Get-Content $Path | 
    ForEach-Object { 

     if($_.Trim() -like "[*]") { $Inside = $False } 
     if($_.Trim() -like "*[MyAction_Log]*") { $Inside = $True } 

     If($Inside -and $_ -like "action = *" -and $_ -notlike "*run fast*") { $Modified = $True; "action = run fast" } else { $_ } 
    } 

If($Modified) { $NewLines | Set-Content $Path } 
2

我会在大肆替换你认为存在的东西之前检查。另外,千万不要使用$Input作为变量名称。这是一个自动变量,不会做你认为它会。

$Path = "$env:ProgramFiles\prog\file.conf" 
$File = Get-Content $Path 
$ReplacementString = @' 
[MyAction_Log] 
action = run fast 
'@ 

If ($File -notmatch 'action\s=\srun\sfast') 
{ 
    $File -replace '\[MyAction_Log\]',$ReplacementString | 
     Set-Content $Path 
} 
+0

你可以使用'-notmatch'并跳过需要一个'else'和多余'return' 。你应该逃避正则表达式中的空间。 – BenH

+1

好点。更新 – TheIncorrigible1

+0

我认为你更新'\ s'到意外的替换字符串中。应该仍然是一个空间。 – BenH