如何使用powershell out-fil以所需的编码方案获得输出

时间:2017-09-11 10:36:25

标签: powershell powershell-v2.0 powershell-v3.0

我有一个要求,我需要逐行读取,然后在具有windows latin 1数据的数据文件中进行字符串/字符替换。

我最初使用out-file -encoding选项编写了这个powershell(我的第一个)。但是,这样创建的输出文件正在进行一些字符转换。然后我搜索并遇到WriteAllLines,但我无法在我的代码中使用它。

$encoding =[Text.Encoding]::GetEncoding('iso-8859-1')
$pdsname="ABCD.XYZ.PQRST"
$datafile="ABCD.SCHEMA.TABLE.DAT"
Get-Content ABCD.SCHEMA.TABLE.DAT | ForEach-Object {
$matches = [regex]::Match($_,'ABCD')
$string_to_be_replaced=$_.substring($matches.Index,$pdsname.Length+10)
$string_to_be_replaced="`"$string_to_be_replaced`""
$member = [regex]::match($_,"`"$pdsname\(([^\)]+)\)`"").Groups[1].Value
$_ -replace $([regex]::Escape($string_to_be_replaced)),$member 
} | [System.IO.File]::WriteAllLines("C:\Users\USer01", "ABCD.SCHEMA.TABLE.NEW.DAT", $encoding)

在@Gzeh Niert的回答的帮助下,我更新了上面的脚本。但是,当我执行脚本时,脚本生成的输出文件只有最后一条记录,因为它无法追加,并且它进行了覆盖,我尝试使用System.IO.File] :: AppendAllText,但这很奇怪创建一个更大的文件,并只有最后一条记录。简而言之,可能就是写出空行。

param(

    [String]$datafile
)
$pdsname="ABCD.XYZ.PQRST"
$encoding =[Text.Encoding]::GetEncoding('iso-8859-1')
$datafile = "ABCD.SCHEMA.TABLE.DAT"
$datafile2="ABCD.SCHEMA.TABLE.NEW.DAT"
Get-Content $datafile | ForEach-Object {
    $matches = [regex]::Match($_,'ABCD')
    if($matches.Success) {
    $string_to_be_replaced=$_.substring($matches.Index,$pdsname.Length+10)
    $string_to_be_replaced="`"$string_to_be_replaced`""
    $member = [regex]::match($_,"`"$pdsname\(([^\)]+)\)`"").Groups[1].Value
    $replacedContent = $_ -replace $([regex]::Escape($string_to_be_replaced)),$member
    [System.IO.File]::AppendAllText($datafile2, $replacedContent, $encoding)
    }
    else {
        [System.IO.File]::AppendAllText($datafile2, $_, $encoding)
        }
    #[System.IO.File]::WriteAllLines($datafile2, $replacedContent, $encoding)
}

请帮我弄清楚我哪里出错了。

1 个答案:

答案 0 :(得分:0)

System.IO.File.WriteAllLines获取字符串数组或IEnumerable字符串作为第二个参数,并且不能通过管道传递给命令,因为它不是CmdLet处理管道输入而是.NET Framework方法。

您应该尝试将已替换的内容存储到string[]中,以便在保存文件时将其用作参数。

param(
    [String]$file
)

$encoding =[Text.Encoding]::GetEncoding('iso-8859-1')
$replacedContent = [string[]]@(Get-Content $file | ForEach-Object {
    # Do stuff
})
[System.IO.File]::WriteAllLines($file, $replacedContent, $encoding)