Powershellスクリプトを変更して、ANSI-Windows-1252エンコーディングでファイルを書き出すにはどうすればよいですか?

3
K9-Guy 2019-03-20 16:00.

毎日の入力バンクファイルからエラーレコードを削除することで「フィルタリングされた」出力ファイルを生成するバンキングアプリケーションスクリプトがあります(Windows Serverスクリプトを作成して、次のファイルからエラーレコードとそれぞれの前のレコードを削除する方法を参照してください)。結果は新しいファイルに書き込まれます)。「フィルタリングされた」出力ファイルは、システムを更新するために州に送信されます。ちなみに、銀行から受け取った元の入力ファイルは、ファイルエディター(UltraEdit)でUnix 1252(ANSI Latin 1)として表示され、各レコードは改行でのみ終了します。

「クリーン」(エラーなし)と「ダーティ」(4つのエラーを含む)の両方の入力ファイルから生成されたいくつかのテスト出力ファイルを州に送信して、実装前にすべてが良好であることを確認するためにテストしましたが、少しでした出力ファイルはCRLF行末のUTF-16エンコーディングで生成され、入力と現在のフィルタリングされていない出力はWindows-1252でエンコードされているためです。このシステム上の他のすべての出力ファイルは、Windows-1252でエンコードされています。

案の定…州のシステムのエンコーディングが正しくないという知らせが返ってきました。彼らのコメントは次のとおりです。「ファイルはUCS-2リトルエンディアンでエンコードされており、システムで実行するにはANSIに変換する必要がありました。それは予想外でした。

その後、詳細なトランザクションのないファイルは、EFT拒否プログラムを介して実行されます。

正常に処理されたようですが、変換を行う必要がありました。ANSIで送信できますか、それともUCS 2リトルエンディアンで送信する必要がありますか?」

–Encoding“ Windows-1252”と–Encoding windows-1252をout-fileステートメントに追加しようとしましたが、どちらも次のメッセージを返しました。Out-File:パラメーター 'Encoding'の引数を検証できません。引数「Windows-1252」は、ValidateSet属性で指定されたセット「unknown、string、unicode、bigendianunicode、utf8、utf7、utf32、ascii、default、oem」に属していません。セットに含まれている引数を指定してから、コマンドを再試行してください。C:\ EZTRIEVE \ PwrShell \ TEST2_FilterR02.ps1:47 char:57 + ... OutputStrings | Out-File $ OutputFileFiltered -Encoding "Windows-1252" + ~~~~~~~~~~~~~~ + CategoryInfo:InvalidData :( :) [Out-File]、ParameterBindingVal idationException + FullyQualifiedErrorId:ParameterArgumentValidationError、Microsoft。 Power Shell.Commands.OutFileCommand

私はこれについて何日も助けを求めて高くも低くも見えましたが、本当に明確なものはなく、私が見つけたものの大部分は、Windows-1252から別のエンコーディングへの変換に関係していました。昨日、stackoverflowのどこかで、「ANSI」はWindows-1252と同じであるというコメントを見つけましたが、これまでのところ、Windows-1252エンコーディングオプションを出力ファイルステートメントに適切に追加する方法を示すものは見つかりませんでした。 Powershellはそれを受け入れます。キューに追加された次のいくつかに取り組むことができるように、私は本当にこのプロジェクトを完了する必要があります。–Encodingに追加する必要がある、欠落しているサブパラメーターがある可能性がありますか?

これは、Powershell5.1を搭載したWindowsServer 2016Standardを実行している新しいバックアップサーバー上のDollarUniverse(ジョブスケジューラ)でテストされています。私たちの本番システムは、Windows Server 2012R2上でPowershell5.1を使用してDollarUniverseを実行します(はい、十分なアップグレードウィンドウを探しています:-)

私の最後の試みの時点で、私のPowershellスクリプトは次のとおりです。

 [cmdletbinding()]
 Param
 (
     [string] $InputFilePath
 )   

 # Read the text file
 $InputFile = Get-Content $InputFilePath

# Initialize output record counter
$Inrecs = 0 $Outrecs = 0

# Get the time
$Time = Get-Date -Format "MM_dd_yy" # Set up the output file name $OutputFileFiltered = "C:\EZTRIEVE\CFIS\DATA\TEST_CFI_EFT_RETURN_FILTERED"

# Initialize the variable used to hold the output
$OutputStrings = @() # Loop through each line in the file # Check the line ahead for "R02" and add it to the output # or skip it appropriately for ($i = 0; $i -lt $InputFile.Length - 1; $i++) { if ($InputFile[$i + 1] -notmatch "R02") { # The next record does not contain "R02", increment count and add it to the output $Outrecs++
        $OutputStrings += $InputFile[$i] } else { # The next record does contain "R02", skip it $i++
    }
}

# Add the trailer record to the output
$OutputString += $InputFile[$InputFile.Length - 1] # Write the output to a file # $OutputStrings | Out-File $OutputFileFiltered $OutputStrings | Out-File $OutputFileFiltered -Encoding windows-1252 # Display record processing stats: $Filtered = $Outrecs-$i

Write-Host $i Input records processed Write-Host $Filtered  Error records filtered out

Write-Host $Outrecs  Output records written

1 answers

6
mklement0 2019-03-20 23:59.

注意:

  • 後で、LF(Unixスタイル)改行が必要であることを明確にしました。下部のセクションを参照してください。

  • 次のセクションでは、最初に尋ねられた質問を扱い、CRLF(Windowsスタイル)改行を含むファイルを作成するソリューションを示します(Windowsで実行した場合)。


場合は、あなたのシステムのUnicode対応でないプログラムの言語設定(別名システムロケールは)持っていることを起こるのWindows-1252アクティブANSIコードページとして、(米国英語または西ヨーロッパのシステムでは、例えば)の使用-Encoding Default、ためDefaultのそのコード・ページを参照Windows PowerShellの(しかしないPowerShellのコアをサポートしていませんBOMレスUTF-8にデフォルト設定と、Defaultエンコードの識別子)。

確認方法: [cultureinfo]::CurrentCulture.TextInfo.ANSICodePage -eq 1252

... | Out-File -Encoding Default $file

注意:

  • 場合あなたが特定されているデータが実際にASCII範囲の文字(除外のような文字がアクセント付き7ビットの範囲、内のコードポイントを持つ文字で独占的に構成されていることü)、-Encoding Defaultお使いのシステムロケールは、ANSIコードページ使用している場合でも動作する他のよりをすべての(シングルバイト)ANSIコードページが7ビットサブレンジのすべてのASCII文字を共有している場合、Windows-1252。次に、を使用することもできますが、-Encoding ASCII結局のところ非ASCII文字が存在する場合、それらはリテラル?文字に音訳され、情報が失われることに注意してください。

  • Set-Contentコマンドレットは、実際にデフォルトDefaultWindows PowerShellの(ただしPowerShellでエンコーディングコア一貫したデフォルトはBOMなしUTF-8です、)。

  • しばらくSet-Contentのそれからの文字列化の挙動が異なるOut-File-この回答を参照してください-ファイルへの書き込みにオブジェクトがすでにあれば、それは実際にはより良い選択だある文字列が。


それ以外の場合は、2つのオプションがあります。

  • .NETFrameworkファイルのI / O機能を直接使用します。ここでは、.NETでサポートされている任意のエンコーディングを使用できます。例えば:

    $lines = ...  # array of strings (to become lines in a file)
    # CAVEAT: Be sure to specify an *absolute file path* in $file, # because .NET typically has a different working dir. [IO.File]::WriteAllLines($file, $lines, [Text.Encoding]::GetEncoding(1252))
    
  • 使用PowerShellのコアあなたがサポートされている任意の.NETエンコーディングを渡すことができます、
    -Encodingパラメータ:

    ... | Out-File -Encoding ([Text.Encoding]::GetEncoding(1252)) $file
    

PSv5.1 +では、この回答で詳しく説明されているように、>および>>演算子使用されるエンコーディングを実際に変更できることに注意してください。ただし、Windows PowerShellでは、のパラメータでサポートされているエンコーディングに制限されています。
Out-File-Encoding


WindowsでLF(Unixスタイル)改行を使用してテキストファイルを作成する:

PowerShell(常に)と.NET(デフォルト)は、[Environment]::NewLine文字列を行としてファイルに書き込むときに、プラットフォームに適した改行シーケンスを使用します。言い換えると、WindowsではCRLF改行を含むファイルになり、Unixライクなプラットフォーム(PowerShell Core)ではLF改行を含むことになります。

以下のソリューションは、ファイルに書き込むデータが、たとえばによって返されるように、書き込む行を表す文字列の配列であると想定していることに注意してくださいGet-Content(結果の配列要素は、末尾の改行シーケンスのない入力ファイルの行です)。

Windows(PSv5 +)でLF改行を含むファイルを明示的に作成するには:

$lines = ... # array of strings (to become lines in a file) ($lines -join "`n") + "`n" | Set-Content -NoNewline $file

"`n" LF文字を生成します。

注意:

  • Windows PowerShellでは、これはアクティブなANSIコードページのエンコーディングを暗黙的に使用します。

  • PowerShell Coreでは、これにより、BOMなしでUTF-8ファイルが暗黙的に作成されます。代わりにアクティブなANSIコードページを使用する場合は、次を使用します。

    -Encoding ([Text.Encoding]::GetEncoding([cultureinfo]::CurrentCulture.TextInfo.ANSICodePage))
    

PSv4-(PowerShellのバージョン4以下)、あなたは直接の.NET Frameworkを使用する必要があります:

$lines = ...  # array of strings (to become lines in a file)


# CAVEAT: Be sure to specify an *absolute file path* in $file, # because .NET typically has a different working dir. [IO.File]::WriteAllText($file, ($lines -join "`n") + "`n")

注意:

  • WindowsPowerShellとPowerShellCoreの両方で、これによりBOMなしのUTF-8ファイルが作成されます。

  • 代わりにアクティブなANSIコードページを使用する場合は[Text.Encoding]::GetEncoding([cultureinfo]::CurrentCulture.TextInfo.ANSICodePage)、追加の引数としてに渡しますWriteAllText()

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

ランボルギーニの創設者であるフェルッチオランボルギーニが100歳になるのは毎日ではありません(そうです、彼は死んでいて、まだ死んでいると思います。

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

Appleが自動車分野に参入するという噂はかなり前から渦巻いており、AppleウォッチャーがSixtyEight Researchという会社がAppleの自動車研究開発のシェル会社である可能性が高いと判断したとき、その渦巻きは本当に渦巻いた。また、会社が購入した車は1台だけであることが知られており、その車はAppleが何を考えているかについての手がかりでいっぱいになる可能性があることも伝えています。

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

太陽系の外側にある架空の大きな物体である惑星Xの探索は、何十年にもわたって人間を魅了してきました。その検索の最新の章は、地球の10倍の大きさで、公転周期が15であるほど遠くにある惑星を指しています。

キャムニュートン、ゴッドダム

キャムニュートン、ゴッドダム

カムニュートンは昨日、簡単な265ヤードと3回のタッチダウンでファルコンズを引き裂き、別の素晴らしいゲームをしました。その日のハイライトは、上のタッチダウンスローでした。これは、視聴するたびにばかげているだけです。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language