2016-08-23 30 views
1

我必須每週更換多個文件中的某個字符串。我正在努力簡化使用PowerShell的是必須更換的行過程如下:每週從多個文件中替換字符串

extract_mdp_staging_error(149); 

其他文件看起來是一樣的,但字符串是前夫不一樣。

extract_kdp_staging(149); 
extract_zub_staging_error(149); 
... 

有沒有辦法告訴我的劇本只是爲了搜索的文本部分在(),並與用戶輸入更換呢?因爲我不能使用硬編碼搜索,因爲下週以後不會有149但是150等等。

編輯 我一直在使用一個腳本來替換使用PowerShell的另一個應用程序文件的整條生產線,但我無法弄清楚如何代碼,因此它只是取代括號中的一部分。 PowerShell腳本:

Get-ChildItem C:\Users\mosermich\Desktop\Extractor\Ressources -Filter '*.sql' -ErrorAction Stop | ForEach-Object { 
     $content = Get-Content $_.Fullname 
     $content[7] = ' rel.nr sqlldr {0}' -f $releasenr 
     $content | Set-Content -Path $_.FullName 
     } 

這裏是在我需要替換()上線2號文件中的一個:

begin 
extract_zdlb_staging(149); 
commit; 
end; 
/
quit; 
+0

這應該使用正則表達式是可行的。你有什麼例子嗎? – Jakodns

+0

對不起,我從來沒有真正與正則表達式。但我發佈了我以前的PowerShell腳本和一個我將需要替換的示例文件。希望這是你的意思。 –

回答

2

我會用一個regex以積極前瞻和回顧後:

$userInput = 250 
$filePath = 'yourFilePath' 

$content = Get-Content $filePath 
$content -replace '(?<=\()(\d+)(?=\))', $userInput | Set-Content $filePath 

正則表達式:

(?<=\()(\d+)(?=\)) 

Regular expression visualization


編輯: 這裏採用您的示例腳本:

$userInput = 250 # The number you want to put in the parentheses 
Get-ChildItem C:\Users\mosermich\Desktop\Extractor\Ressources -Filter '*.sql' -ErrorAction Stop | 
    ForEach-Object { 
     $content = Get-Content $_.Fullname 
     $content -replace '(?<=\()(\d+)(?=\))', $userInput | Set-Content $_.Fullname 
    } 
+0

謝謝你的快速回答並解釋! (在過去的幾天裏,我的PowerShell問題一直在幫助我很多)。如果我使用正則表達式,它確實隻影響()中的數字,但它不會在裏面插入新數字。難道我做錯了什麼? –

+0

不客氣:-)。如果你運行我的第一個腳本,是不是把250放在括號內? –

+0

我在一個完整的新文件中嘗試了它,並以管理員身份運行它。它會刪除括號內的舊號碼,但不會填入新號碼。 –

相關問題