Windows Powershell用于替换文件夹中文本文件的一组字符

时间:2015-11-03 21:17:11

标签: powershell

处理代码,该代码将替换文件夹中文本文件中的一组字符。有没有办法可以为文件夹中的所有文件执行此操作。我正在使用Windows 7操作系统和Powershell版本3.附上我拥有的代码。问题是,当我运行代码(New_NOV_1995.txt)时它会创建一个新文件,但它不会像代码中提到的那样更改新文件中的任何字符。非常感谢欣赏。

    $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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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的回答在我发布时被修改了。他正在通过管道发送所有内容,我将数组存储在变量中,然后循环遍历。管道方法可能更有效。对于数组的每个元素,具有第二个循环的变量更容易修改,而不仅仅是两个替换。