我有一个要求,我需要逐行读取,然后在具有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)
}
请帮我弄清楚我哪里出错了。
答案 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)