2015-12-24 37 views
0

Powershell(以及一般編程)非常新穎,請耐心等待。我最近創建了一個腳本,允許用戶修改備份文件中的系統名稱,然後使用新設置創建一個新的.txt文件。我遇到的問題是該腳本僅適用於遵循我們的命名約定的系統 - 新系統或錯誤命名的系統會導致腳本失敗,因爲它搜索的名稱尚不存在。這是我到目前爲止有:Powershell:替換.txt中的值

$name = Read-Host 'What is the system name?' 
$currentdate = Get-Date -Format "MM_DD_YY_HH_MM_SS" 
if ($name -notlike "Sample*") 
    { 
     Read-Host 'Please begin naming conventions with "Sample".' 
     } 
     else { 
     (Get-Content C:\Test_Backup.txt)| 
Foreach-Object {$_-replace 'Sample[a-z , 0-9]*' , $name}| 
Out-file C:\Test_Success.txt} 

因此,舉例來說,當你打開一個新的/不正確的系統備份文件,並查找系統名稱,它顯示爲名稱「 Wrongname123」該腳本在該文件中找不到「Sample *」,因此沒有任何反應。我想要做的是通過將出現在引用內的任何名稱替換爲正確的用戶輸入名稱,將腳本更改爲使用新的/錯誤命名的系統。我甚至不確定這是否可能,而且迄今爲止我還無法通過谷歌搜索找到答案,我想這是因爲我很難解釋我希望它做什麼。我非常感謝我能得到的任何幫助。

編輯:

我在做什麼在一個.txt正在創建的系統設置備份。當您打開備份文件,它看起來是這樣的:

名:「系統1」 VOLUME:「30」 輸入:「RGB」 等等

我所做的就是創建一個「主」備份文件,以便用戶可以快速將文件上傳到新系統,而無需手動輸入所有正確的設置。唯一的問題是用戶在上傳到新系統時必須更改名稱(每個系統都有一個唯一的名稱)。我的備份文件示例非常簡單 - 文件中包含大量信息,因此不容易進入並手動更改。當我運行腳本時,它會提示用戶輸入他們正在配置的系統的名稱。因此,如果系統目前被命名爲「Sample6」,並且用戶想要將其更改爲「Sample7」,則不存在任何問題。但是,如果系統被命名爲「錯誤名稱1」,則該腳本將不起作用,因爲它正在尋找「示例」命名約定。所以我想弄清楚的是我如何讓腳本查找NAME:「[這裏有任何值]」,然後更改引用中包含的任何值。希望這個更有意義!

+0

我作爲一個初學者,儘量遠離正則表達式,尤其是那種形式。從我收集你可能會有流動/錨定問題。其次,它看起來像「樣本」是一個想要的模式,但你要取代它? :)凸輪你發佈一個例子或兩個好的和壞的線? –

+0

嗨Jaqueline,感謝您的迴應。我更新了我原來的帖子 - 我希望它現在更有意義! – Blake

+0

那麼,爲什麼不只是讀取系統名稱,如果它的「壞」要麼改變它或記錄它?另外,你可能會考慮使用不同的「文本」文件格式--JSON或psd1似乎適合這樣的任務,也是XML,但它會有點矯枉過正,這與 –

回答

2

如果我理解你的問題,你正在尋找替換引號與用戶輸入之間的內容。如果是這樣的話,只需用一個從this answer更換您的正則表達式,像這樣:

Foreach-Object {$_-replace '(["''])(?:(?=(\\?))\2.)*?\1' , $name}| 

注意雙撇號,因爲PowerShell使用的常量字符串省略號。如果這是你的意圖,那麼一旦你有足夠的聲望,確保你贊成那張海報的答案。

如果Test_Backup.txt包含冒號分隔的屬性列表,像這樣:

NAME: "WrongName123" 
LAST_BACKUP: "12_24_15_12_00_00" 
FAVORITE_COLOR: "Blue" 

那麼你的腳本將在引號替換所有值。如果您只想替換標記爲NAME的那個,則需要將Where-Object調用插入管道。我使用-like但你可以使用-match還有:

(Get-Content C:\Test_Backup.txt) | 
Where-Object { $_ -like 'NAME:*' } | 
Foreach-Object {$_ -replace '(["''])(?:(?=(\\?))\2.)*?\1', $name} | 
Out-File C:\Test_Success.txt 

快樂編程!

+0

這正是我想要做的!謝謝詹姆斯! – Blake

+0

我忘記了星號中的-like子句,確保將它標記爲接受答案。享受 – JamesQMurphy