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