2015-11-03 104 views
0

使用代碼替換文件夾中文本文件的一組字符。有一種方法可以爲文件夾中的所有文件執行此操作。我正在使用Windows 7操作系統和Powershell版本3.附加我擁有的代碼。問題是,當我運行代碼(New_NOV_1995.txt)時它會創建一個新文件,但它不會像代碼中所述那樣更改新文件中的任何字符。非常感謝幫助。Windows Powershell替換文件夾中文本文件的一組字符

$lookupTable = @{ 
'¿' = '|' 
'Ù' = '|' 
'À' = '|' 
'Ú' = '|' 
'³' = '|' 
'Ä' = '-' 
} 

$original_file = 'C:\FilePath\NOV_1995.txt' 
$destination_file = 'C:\FilePath\NOV_1995_NEW.txt' 

Get-Content -Path $original_file | ForEach-Object { 
    $line = $_ 

    $lookupTable.GetEnumerator() | ForEach-Object { 
     if ($line -match $_.Key) 
     { 
      $line = $line -replace $_.Key, $_.Value 
     } 
    } 
    $line 
} | Set-Content -Path $destination_file 
+0

在第一行中使用'Get-ChildItem'而不是'Get-Content'。 –

回答

1

在下面的例子中,我假設H:\ Replace_String是一個目錄。在你的代碼中,你沒有反斜槓,所以它只會選擇H:的根目錄中的文件。

$configFiles = Get-ChildItem -path H:\Replace_String\*.txt 
foreach ($file in $configFiles) 
{ 
    (Get-Content $file) | 
    Foreach-Object { $_ -replace "Cat", "New_Cat" } | 
    Foreach-Object { $_ -replace "Dog", "New_Dog" } | 
    Set-Content $file 
} 
+0

Thx Tony ...此代碼給出錯誤:路徑中找不到位置參數。 –

+0

它適用於我 - 唯一不同的是我使用C:而不是H :.我正在運行PowerShell 4.0,所以如果你正在運行的東西可能會有所作爲。我谷歌「位置參數無法找到路徑」,它出現零點擊。你是否包含完整的錯誤信息?你可以嘗試在H:\ Replace_String \ *。txt周圍加引號,但我不知道還有什麼可以試試我的頭頂。 –

+0

「在H:\ Replace_string \ .ps1 .. + $ ConfigFiles = Get-content - path

1

Tony Hinkle提出的(原始)答案需要另一個循環。原因是Get-Content產生一個數組。每行代表數組的一個元素。

$configFiles = Get-ChildItem -path 'H:\Replace_String\*.txt' 

foreach ($file in $configFiles){ 
    $output = @() 
    $content = Get-Content $file 

    foreach ($line in $content) { 
     $line = $content.Replace("Cat", "New_Cat") 
     $line = $content.Replace("Dog", "New_Dog") 

     $output += $line 

    } 

    $output | Set-Content -Path $file 
} 

編輯:我注意到Tony Hinkle的回答在我發佈時已經修改。他通過一個管道發送一切,我將數組存儲在一個變量中,然後循環。管道方法可能更有效率。對於數組中的每個元素,使用第二個循環的變量更容易修改,而不僅僅是兩次替換。

相關問題