SSブログ

PowerShell小僧:nkfで文字コード変更 [コンピューター]

PowerShell小僧:文字化けの対処
https://cheese999.blog.ss-blog.jp/2021-09-17
では、xyzzyテキストエディタでUTF-8(BOM有り)への文字コード変更を行いましたが、PowerShellとnkfで文字コード変更を行うスクリプトを作成しました。

【参考にした情報】
・nkfで文字コード変換
https://qiita.com/kentakozuka/items/d874a572ddf6cc34213f
・フォルダ内のファイル一覧を取得し、全てのファイルを処理する方法
https://bayashita.com/p/entry/show/228

【nkf_UTF8wBOM1.ps1:nkfでファイルの文字コードをUTF-8のBOMありに変更して上書きする】
# nkfでファイルの文字コードをUTF-8のBOMありに変更して上書きする。
# 日本語を含むスクリプトを実行すると文字化けが発生する。
# パラメータ
Param(
  [Parameter(Mandatory=$true)]
  [String]$TargetFile1 # 対象ファイル
)
# 関数:文字コードを表示
function myFShChrCd1{
  [String]$result = chcp
  #$result.GetType().FullName
  # ":"で分割
  [String[]]$BUF1 = $result.Split(":")
  #$BUF1.GetType().FullName
  # 2個目の文字列
  $BUF2 = $BUF1[1]
  #$BUF2.GetType().FullName
  # 空白を削除
  [String]$ChCode1 = $BUF2.Trim()
  #echo $ChCode1
  #$ChCode1.GetType().FullName
  switch ($ChCode1){
    "65001"{Write-Host "Character code is UTF-8(65001).";break}
    "932"{Write-host "Character code is Shift-JIS(932).";break}
    default{Write-Host "Character code is unknown.";break}
  }
}
# 関数:何も入力されなかったら、デフォルト値を返す
Function Read-HostDefault($Prompt, $Default) {
  # デフォルト値がある時のプロンプト
  if ($Default) {
      $Prompt = "$Prompt [$Default]"
  }
  # コンソール入力
  $val = Read-Host $Prompt
  # 何も入力されなかったら、デフォルト値を返す
  if($val -eq ""){
    Return $Default
  }else{
    Return $val
  }
  # ($default,$val)[[bool]$val]
}
# なくても動くが日本語を含む出力が文字化けする
#$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
# 文字コードをUTF-8に変更
# chcp 65001
# 文字コードを表示
myFShChrCd1
# 入力待ち
Read-HostDefault "OK?" > $null
# 定数
$myResult1 = $false # 実行結果
# スクリプト本体
# 文字コード変換
C:\ProgramFiles\nkf\nkf.exe -w8 --overwrite $TargetFile1
#実行結果
$myResult1 = $true
# 終了
Return $myResult1

【フォルダ内のファイルを1つずつnkf_UTF8wBOM1.ps1に渡して文字コード変換する:nkf_UTF8wBOM2.ps1】
# nkfでファイルの文字コードをUTF-8のBOMありに変更して上書きする。
# フォルダ内のファイル全て変換する
# パラメータ
Param(
  [Parameter(Mandatory=$true)]
  [String]$InFolder1 # 対象フォルダ
)
$commandPath = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
$stdErrLogTmp = ".\stderr.log"
$stdOutLogTmp = ".\stdout.log"
$myResult1 = $true
if (-not(Test-Path($InFolder1))) {
  Write-Host $InFolder1"がありません。"
  $myResult1 = $false
}
if ($myResult1 -eq $true) {
  # $InFolder1内のファイル・フォルダのリストを取得する。
  # -Recurseを付けるとサブフォルダも検索する。
  $itemList = Get-ChildItem $InFolder1 -Recurse;
  foreach($item in $itemList){
    if($item.PSIsContainer){
      # フォルダの場合の処理
      Write-Host ($item.Name + 'はフォルダです。');
    }else{
      # ファイルの場合の処理
      Write-Host ($item.Name + 'はファイルです。');
      $ScriptFile1 = "C:\abcde\PowerShell\nkf_UTF8wBOM1.ps1 -TargetFile1 $item"
      $Argument1 = "-Command $ScriptFile1"
      Start-Process -FilePath $commandPath `
      -ArgumentList $Argument1 `
      -NoNewWindow `
      -RedirectStandardOutput $stdOutLogTmp -RedirectStandardError $stdErrLogTmp -Wait
      Write-Host "終了"
      Get-Content $stdErrLogTmp, $stdOutLogTmp
      foreach($strLogPath in @($stdErrLogTmp, $stdOutLogTmp)){
        if (Test-Path $strLogPath) {
          Remove-Item $strLogPath;
        }
      }
    }
  }
}
# 終了
Return $myResult1

ヤバイぜ!(16)  コメント(1) 
共通テーマ:パソコン・インターネット

ヤバイぜ! 16

コメント 1

cheese999

ヤバイぜ! ありがとうございます(^_0)ノ
by cheese999 (2021-09-17 23:19) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字(英大文字の「オー」、英小文字の「ユー」、アラビア数字の「ハチ」、アラビア数字の「イチ」、アラビア数字の「ニ」)を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。