使用Powershell替换文本文件中的字符串串

使用Powershell替换文本文件中的字符串串,powershell,windows-7,powershell-3.0,Powershell,Windows 7,Powershell 3.0,正在处理PowerShell代码,该代码将替换文件夹中文本文件(包含大量文本文件)中的一组字符。是否有一种方法可以对文件夹中的所有文件执行此操作 问题是,当我运行代码(new_NOV_1995.txt)时,它会创建一个新文件,但不会更改新文件中的任何字符 $lookupTable = @{ '¿' = '|' 'Ù' = '|' 'À' = '|' 'Ú' = '|' '³' = '|' 'Ä' = '-' } $original_file = 'C:\FilePath\NOV_1

正在处理PowerShell代码,该代码将替换文件夹中文本文件(包含大量文本文件)中的一组字符。是否有一种方法可以对文件夹中的所有文件执行此操作

问题是,当我运行代码(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

虽然这样做可行,但性能可能是个问题。我唯一的测试是在一个包含
$lookupTable
的小文件上进行的

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

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

$originalContent = Get-Content -Path $original_file
$lookupTable.GetEnumerator() | % {
   $originalContent = $originalContent -replace $_.Key,$_.Value
}
$originalContent | Out-File -FilePath $destination_file

你的代码实际上对我有用。您的文件仍然可能存在编码问题。当您使用
Get Content$path
将文件读入控制台时,文件看起来是否正确?如果文件看起来不正确,您可能需要使用
设置内容
获取内容
cmdlet


改进您当前的逻辑

我将您的
$lookuptable
更改为一对PSObject。由于您对大多数部分进行相同的替换,我将它们合并到一个正则表达式中

下一部分我支支吾吾,但因为在我提议的改变之后,你只做了两次替换,我想你可以把这两个链接成一条替换线。否则你可以在那里有一个foreach对象,但我认为这更简单更快

这样我们就不需要测试比赛了<代码>-替换正在为我们进行测试

$toPipe = [pscustomobject]@{
    Pattern = '¿|Ù|À|Ú|³'
    Replacement = "|"
}
$toHypen =  [pscustomobject]@{
    Pattern = 'Ä'
    Replacement = "-"
}

$path = "c:\temp\test\test"
Get-ChildItem -Path $path | ForEach-Object{
    (Get-Content $_.FullName) -replace $toPipe.Pattern,$toPipe.Replacement -replace $toHypen.Pattern,$toHypen.Replacement | 
            Set-Content $_.FullName 
}
请注意,这将更改原始文件。鼓励进行测试


>代码>设置内容>代码>获取内容在性能方面不是最好的,因此您可能需要考虑使用<代码> [IO.file ]::RealLeLoad($file)< /C>及其伙伴静态方法>代码> [IO .file ]::RealeAlLeLayes($file)< /Calp> < /P>所提到的特殊字符的可能副本('',',',',',',',''”)在一个文本文件中多次出现。除此之外,我想改进您的替换逻辑。你的文件也很大吗?我以为有编码问题,但测试表明我可能弄错了。它对你有用吗?……对我来说,它没有改变特殊字符。只需复制和粘贴相同的旧文件。