PowerShell小僧:ファイル名の一括置換(その2)(改6) [コンピューター]
PowerShell小僧:ファイル名の一括置換(その2)(改5)
https://cheese999.blog.ss-blog.jp/2021-08-23
に対して下記の変更をしました。
1.functionに対して、配列を引数として与え、配列を返り値として返す方法を
試すためにReferArrayList関数を追加。
配列を返すとき、カンマ演算子が必要でした。
【スクリプト】
## 定数 ##
# 文字コード変換DLL
$myDLL = "C:\abcde\PowerShell\ReadJEnc\dll\net47\Hnx8.ReadJEnc.dll"
# スクリプトがある場所
$ScriptPath1 = Split-Path $MyInvocation.MyCommand.Path -Parent
# 履歴ファイル
$HistFile1 = $ScriptPath1+"\FilePath2.txt"
# 拡張子ファイル
$ExtFile1 = $ScriptPath1+"\FileExtension2.txt"
# 変換対象ファイル名の拡張子を除いた部分の正規表現
$TargetName1="^.+_.+_.+_.+$"
# 関数:文字コードを表示
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()
#Write-Host $ChCode1
#$ChCode1.GetType().FullName
switch ($ChCode1){
"65001"{Write-Host "文字コードはUTF-8(65001)です。";break}
"932"{Write-Host "文字コードはShift-JIS(932)です。";break}
default{Write-Host "文字コードは不明です。";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]
}
# 関数:ファイルの存在確認
Function myFFileExist1($myFileText1, [ref]$myFilePath1) {
# $myFileText1 : ファイルを表す文字列
# $myFilePath1 : ファイルパス
# 返り値:true/false = ファイルが存在する/しない
$myFilePath2 = $myFilePath1.Value
# Write-Host "`$myFilePath2="$myFilePath2
[String]$myString1 = $myFileText1 + "?"
$myFilePath2 = Read-HostDefault $myString1 $myFilePath2
if(-Not(Test-Path $myFilePath2)){
$myString1 = $myFileText1 + "が存在しません。"
Write-Host $myString1
Write-Host "ファイルパス="$myFilePath2
Return $FALSE
}else{
$myFilePath1.Value = $myFilePath2
Return $TRUE
}
}
# 関数:文字コード判別
Function myMojiCode1($Name1){
If($Name1.IndexOf("ShiftJIS") -ge 0){
$myMojiCoding1 = "Default"
}ElseIf($Name1.IndexOf("UTF-8") -ge 0){
$myMojiCoding1 = "UTF8"
}ElseIf($Name1.IndexOf("EUCJP") -ge 0){
$myMojiCoding1 = -1
}ElseIf($Name1.IndexOf("ASCII") -ge 0){
$myMojiCoding1 = "ASCII"
}Else{
$myMojiCoding1 = -1
}
Return $myMojiCoding1
}
# 関数:英数字1文字をランダムに発生(a-z,A-Z,0-9)
Function myRnd1Char($myMode1){
if($myMode1 -eq 1){
# 英字(a-z,A-Z)
$myCharCode1 = Get-Random -Maximum 51 -Minimum 0
}else{
# 英数字(a-z,A-Z,0-9)
$myCharCode1 = Get-Random -Maximum 61 -Minimum 0
}
if(($myCharCode1 -ge 0) -and ($myCharCode1 -le 25)){
# 英字(A-Z)
$myCharCode1 = $myCharCode1 + 65
}elseif(($myCharCode1 -ge 26) -and ($myCharCode1 -le 51)){
# 英字(a-z)
$myCharCode1 = $myCharCode1 + 71
}elseif(($myCharCode1 -ge 52) -and ($myCharCode1 -le 61)){
# 数字(0-9)
$myCharCode1 = $myCharCode1 - 4
}
$encoding_wk = [system.Text.Encoding]::GetEncoding("ASCII")
$myChar1 = $encoding_wk.GetChars($myCharCode1)
Return $myChar1
}
# 関数:英数字のランダム文字列を発生(a-z,A-Z,0-9)
Function myRndStr1($myLength1){
# $myLength1 : 文字列長
$tmpName1 = myRnd1Char(1) # 1文字目は英字
[int]$myLength2 = $myLength1 - 1
if($myLength2 -ge 1){
for($myCNT3=1;$myCNT3 -le $myLength2;$myCNT3++){
$tmpName1 += myRnd1Char(2) # 2-n文字目は英数字
}
}
Return $tmpName1
}
# 関数:配列を受け取る
function ReferArrayList{
param(
[Parameter(Mandatory=$true)]
[object[,]]$myExt1, # 拡張子(配列)
[int]$numCol1 # 拡張子配列の列数
)
# $myExt1.GetType()
$RowLength1 = $myExt1.Length # 行数
$RowLength1 = $RowLength1 / $numCol1 # 行数 / 列数
Write-Host "RowLength1="$RowLength1
Write-Host "numCol1="$numCol1
for($i=0; $i -lt $RowLength1; $i++){
$tmpString1 = "myExt1[" + $i + "]="
for($j=0; $j -lt $numCol1; $j++){
$tmpString1 += $myExt1[@($i, $j)] + " "
}
Write-Host $tmpString1
}
$myExt2 = New-Object "object[,]" $RowLength1,$numCol1
$myExt2 = $myExt1
for($i=0; $i -lt $RowLength1; $i++){
$tmpString1 = "myExt2[" + $i + "]="
for($j=0; $j -lt $numCol1; $j++){
$tmpString1 += $myExt2[@($i, $j)] + " "
}
Write-Host $tmpString1
}
# $myExt2.GetType()
return ,$myExt2
}
# 関数:終了処理
Function End_Process1($CurrentPath1){
# 現在のパス
Write-Host "現在のパス(Get-Location)"
Get-Location
# 入力待ち
Read-HostDefault "OK?" > $null
# スクリプト実行前のパスに戻る
Write-Host "スクリプト実行前のパスに戻ります。"
Set-Location $CurrentPath1
# 現在のパス
Write-Host "現在のパス(Get-Location):スクリプト実行前"
Get-Location
write-host "文字コードをShift-JIS(932)に変更します。"
# 入力待ち
Read-HostDefault "OK?" > $null
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
}
# ここから本体コード
# DLLを読み込み
# Write-Host "`$myDLL="$myDLL
$myAnswer1 = myFFileExist1 -myFileText1 "文字コード変換DLL" -myFilePath1 ([ref]$myDLL)
if($myAnswer1 -eq $FALSE){exit} # DLLが存在しない場合は終了
[Reflection.Assembly]::LoadFile($myDLL) > $null
[int]$numCol1 = 3 # 拡張子ファイルの列数
# 拡張子ファイルを読み込み
$myAnswer1 = myFFileExist1 -myFileText1 "拡張子ファイル" -myFilePath1 ([ref]$ExtFile1)
if($myAnswer1 -eq $FALSE){exit} # DLLが存在しない場合は終了
# 拡張子ファイルの文字コード確認
$file=Get-Item $ExtFile1
$reader=new-object Hnx8.ReadJEnc.FileReader($file)
[String]$ReaderName1 = $reader.Read($file).Name
Write-Host "`$reader.Read(`$file).Name="$ReaderName1
$myMojiCoding1 = myMojiCode1($ReaderName1)
Write-Host "`$myMojiCoding1="$myMojiCoding1
$myLine1 = (Get-Content -LiteralPath $ExtFile1|Measure-Object -Line).Lines
Write-Host "拡張子ファイルの行数="$myLine1
If($myMojiCoding1 -eq -1){
# 拡張子ファイルの文字コードが不明な場合
Write-Host "拡張子ファイルの文字コードが不明です。"
exit
}Else{
# 拡張子ファイルの文字コードが明確な場合
# 拡張子変数の配列宣言
$myExt1 = New-Object "object[,]" $myLine1,$numCol1
$myExt2 = New-Object "object[,]" $myLine1,$numCol1
$myCNT4 = 0 # 拡張子カウンタ
$Str_array1 = @() # 配列初期化
foreach($tmpExt1 in Get-Content $ExtFile1 -Encoding $myMojiCoding1){
$Str_array1 = $tmpExt1 -Split ",";
$myExt1[$myCNT4,0] = $Str_array1[0] # 拡張子(変更前)
$myExt1[$myCNT4,1] = $Str_array1[1] # 0/1 = ファイル名変更しない/する
$myExt1[$myCNT4,2] = $Str_array1[2] # ダミー
$myExt1_0 = $myExt1[@($myCNT4,0)]
$myExt1_1 = $myExt1[@($myCNT4,1)]
$myCNT4_1 = $myCNT4 + 1
Write-Host "`$myExt1("$myCNT4_1"/"$myLine1")="$myExt1_0","$myExt1_1
$myCNT4++
}
}
# write-host "myExt1.GetType()="$myExt1.GetType()
$myExt2 = ReferArrayList -myExt1 $myExt1 -numCol1 $numCol1
for($i=0; $i -lt $myLine1; $i++){
$tmpString1 = "myExt2[" + $i + "]="
for($j=0; $j -lt $numCol1; $j++){
$tmpString1 += $myExt2[@($i, $j)] + " "
}
Write-Host $tmpString1
}
Read-HostDefault "OK?" > $null # 入力待ち
# 文字コードをUTF-8に変更
chcp 65001
# 文字コードを表示
myFShChrCd1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
Write-Host "スクリプトがある場所="$ScriptPath1
Read-HostDefault "OK?" > $null # 入力待ち
# 履歴変数の配列宣言
$PrevPath1 = @()
# 履歴ファイル
$myAnswer1 = myFFileExist1 -myFileText1 "履歴ファイル" -myFilePath1 ([ref]$HistFile1)
if($myAnswer1 -eq $FALSE){
# 履歴ファイルが存在しない
# $PrevPath1 += $CurrentPath1 # 履歴変数にカレントパスを追加
exit # 強制終了
}else{
# 履歴ファイルが存在する場合
# 履歴ファイルの文字コード確認
$file=Get-Item $HistFile1
$reader=new-object Hnx8.ReadJEnc.FileReader($file)
[String]$ReaderName1 = $reader.Read($file).Name
Write-Host "`$reader.Read(`$file).Name="$ReaderName1
$myMojiCoding1 = myMojiCode1($ReaderName1)
Write-Host "`$myMojiCoding1="$myMojiCoding1
$myLine2 = (Get-Content -LiteralPath $HistFile1|Measure-Object -Line).Lines
Write-Host "履歴ファイルの行数="$myLine2
If($myMojiCoding1 -eq -1){
# 履歴ファイルの文字コードが不明な場合
Write-Host "履歴ファイルの文字コードが不明です。"
# $PrevPath1 += $CurrentPath1 # 履歴変数にカレントパスを追加
exit # 強制終了
}Else{
# 履歴ファイルの文字コードが明確な場合
# 履歴ファイルを履歴変数(配列)に読み込み
# $PrevPath1=Get-Content $HistFile1 -totalcount 1 -Encoding $myMojiCoding1
# $OutputEncoding = [console]::OutputEncoding;
# Write-Host "`$PrevPath1=$PrevPath1"
$PrevPath1=(Get-Content $HistFile1 -Encoding $myMojiCoding1) -as [string[]]
}
}
$Str_array1 = @() # 文字列配列
[int]$myCNT1 = 1 # 履歴カウンタ(foreachループ)
$ErrFlg1 =$FALSE # エラーフラグをリセット
# 履歴の数だけ繰り返し
foreach ($MyPrev1 in $PrevPath1){
$Str_array1 = $MyPrev1 -Split "," # 履歴をカンマで区切る
$MyFilePath1 = $Str_array1[0] # 履歴0 : ファイルがあるフォルダ
$MyFlag1 = $Str_array1[1] # 履歴1 : 対話/バッチ = 0/1
$TargetName1 = $Str_array1[2] # 履歴2 : 変換対象ファイル名
[String]$StartNo = $Str_array1[3] # 履歴3 : ファイル名の連番の開始番号
Write-Host "履歴番号(myCNT1/myLine2)=($myCNT1/$myLine2)"
Write-Host "MyFilePath1="$MyFilePath1
Write-Host "MyFlag1="$MyFlag1
Write-Host "TargetName1="$TargetName1
Write-Host "StartNo="$StartNo
$tmpStr1 = $MyFilePath1.Substring(0,1)
# Write-Host "tmpStr1="$tmpStr1
if($tmpStr1 -eq "#"){
Write-Host "履歴の頭文字が#なので変換をスキップします。"
$ErrFlg1 = $TRUE
}
Read-HostDefault "OK?" > $null # 入力待ち
if(($MyFlag1 -eq 0) -and ($ErrFlg1 -eq $FALSE)){
# 変換対象ファイル名を入力
$TargetName1 = Read-HostDefault "変換対象ファイル名?" $TargetName1
# ファイルがあるフォルダを入力
$MyFilePath1 = Read-HostDefault "($myCNT1/$myLine2)ファイル名変更の対象ファイルがあるフォルダ?" $MyFilePath1
}
if($ErrFlg1 -eq $FALSE){
if(-Not(Test-Path $MyFilePath1)){
# フォルダが存在しない
Write-Host "フォルダが存在しません。"
$ErrFlg1 = $TRUE # エラーフラグをセット
}else{
# フォルダが存在する場合
Set-Location -LiteralPath $MyFilePath1 # ファイルがあるフォルダへ移動
[int]$TotalCount1 = 0 # 総ファイル数
[int]$myCNT4 = 0 # 拡張子カウンタ
$myExtCount1 = @() # 拡張子ごとのファイル数の配列宣言
for($myCNT4 = 0; $myCNT4 -lt $myLine1; $myCNT4++){
$myExt1_0 = $myExt1[@($myCNT4,0)] # 拡張子
$myExt1_1 = $myExt1[@($myCNT4,1)] # 0/1 = ファイル名変更しない/する
$myExtCount1 += (Get-ChildItem -File *.$myExt1_0|Where-Object{$_.Name -match $TargetName1}|Measure-Object).Count # 拡張子ごとのファイル数を配列に追加
$j=$myExtCount1[$myCNT4] # 拡張子ごとのファイル数を作業用変数に格納
if($myExt1_1 -eq 1){$TotalCount1 += $j} # 拡張子ごとのファイル数を総ファイル数に足す
$myCNT4_1 = $myCNT4+1
Get-ChildItem -File *.$myExt1_0|Where-Object{$_.Name -match $TargetName1}
Write-Host $myExt1_0"("$myCNT4_1"/"$myLine1")のファイル数="$j"[myExt1_1="$myExt1_1"]"
}
Write-Host "変換対象ファイル数="$TotalCount1
# 対象ファイル数が0の場合、エラーフラグをセット
if($TotalCount1 -eq 0){
Write-Host "変換対象ファイルがありません。"
$ErrFlg1 = $TRUE # エラーフラグをセット
}else{
switch($MyFlag1){
0{$myINPUT1 = "N"} # 対話
1{$myINPUT1 = "Y"} # バッチ
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myInput1 = Read-HostDefault "ファイル名を変更しますか(Y/N)?" $myInput1
}
# Y以外なら、エラーフラグをセット
if($myInput1 -ne "Y"){
$ErrFlg1 = $TRUE
Write-Host "Y以外が入力されました。"
}
}
}
}
# Write-Host "ErrFlg1="$ErrFlg1
# エラーフラグが偽なら、ファイル名の連番の開始番号を入力
if($ErrFlg1 -eq $FALSE){
if($MyFlag1 -eq 0){
[String]$StartNo = Read-HostDefault "ファイル名の連番の開始番号?" $StartNo
}
# ヌル判定
# if ([String]::IsNullOrEmpty($StartNo)){
# Write-Host "開始番号に何も入力されなかったので、開始番号=1とします。"
# [string]$StartNo = "1"
# Read-HostDefault "OK?" > $null # 入力待ち
# }
# 変換後の整数変数
[Int]$StartNo1 = 0
# 整数変換
[Bool]$Result1 = [int]::TryParse($StartNo, [ref]$StartNo1)
if($Result1 -eq $FALSE){
$ErrFlg1 = $TRUE # エラーフラグをセット
Write-Host "開始番号="$StartNo" に整数以外が入力されました。"
Read-HostDefault "OK?" > $null # 入力待ち
}
}
# エラーフラグが偽なら、新しいファイル名の確認
if($ErrFlg1 -eq $FALSE){
# $Str_array1 = $TargetName1 -Split "_";
[String]$String1 = "新しいファイル名:" + "xxx" + "_" + "xxx" + "_" + "xxx"
$String1 = $String1 + "_" + $StartNo1.tostring("000") + ".xxx でよろしいですか(Y/N)?"
$myINPUT1 = "Y"
if($MyFlag1 -eq 0){$myInput1 = Read-HostDefault $String1 "N"}
if($myInput1 -ne "Y"){
$ErrFlg1 = $TRUE # エラーフラグをセット
Write-Host "Y以外が入力されました。"
}
}
# エラーフラグが偽なら、ファイル名変換と履歴書込を実施
if($ErrFlg1 -eq $FALSE){
# ???_???_???_001.???, ???_???_???_002.??? と昇順で名前を付け替える
Write-Host "番号 変更前 変更後(1回目)"
for($myCNT4 = 0; $myCNT4 -lt $myLine1; $myCNT4++){
$myExt1_0 = $myExt1[@($myCNT4,0)] # 拡張子
$myExt1_1 = $myExt1[@($myCNT4,1)] # 0/1 = ファイル名変更しない/する
if($myExt1_1 -eq 1){
Get-ChildItem -File *.$myExt1_0| Where-Object{$_.Name -match $TargetName1} | Sort-Object Name | ForEach-Object {$myCNT3 = $StartNo1} {
$String1 = [System.IO.Path]::GetFileNameWithoutExtension($_); # 拡張子を除いた元のファイル名
$Str_array1 = $String1 -Split "_"; # アンダーバー(_)で分割、配列に代入
$NumX = 2 - $Str_array1.Length
# Write-Host "NumX="$NumX
for($i=0; $i -le $NumX; $i++){
$Str_array1 += "x"
}
# Write-Host $Str_array1.Length
for($i=0; $i -le 2; $i++){
if([String]::IsNullOrEmpty($Str_array1[$i])){
$Str_array1[$i] = "x"
}
}
$String1 = $String1 + $_.extension
$myRndStr1 = myRndStr1(3) # 3文字のランダム文字列
$NewFilename = $Str_array1[0] + "_" + $Str_array1[1] + "_" + $Str_array1[2] + "_" + $myCNT3.tostring("000") + $myRndStr1
$myMatchPattern1 = "^" + $NewFilename + "$"
# 重複ファイル数
$myMatchCount = (Get-ChildItem|Where-Object {$_.Name -match $myMatchPattern1}|Measure-Object).Count
if($myMatchCount -ge 1){
Write-Host "ファイル名="$NewFilename"が重複するので変換を中止します。"
exit
}
$NewFilename = $NewFilename + $_.extension
Write-Host $myCNT1" "$myCNT3" "$String1" "$NewFilename;
Rename-Item $_ $NewFilename;
$myCNT3++
}
Read-HostDefault "OK?" > $null # 入力待ち
Write-Host "番号 変更前 変更後(2回目)"
Get-ChildItem -File *.$myExt1_0| Where-Object{$_.Name -match $TargetName1} | Sort-Object Name | ForEach-Object {$myCNT3 = $StartNo1} {
$String1 = [System.IO.Path]::GetFileNameWithoutExtension($_);
$Str_array1 = $String1 -Split "_";
$String1 = $String1 + $_.extension
$NewFilename = $Str_array1[0] + "_" + $Str_array1[1] + "_" + $Str_array1[2] + "_" + $myCNT3.tostring("000")
$myMatchPattern1 = "^" + $NewFilename + "$"
# 重複ファイル数
$myMatchCount = (Get-ChildItem|Where-Object {$_.Name -match $myMatchPattern1}|Measure-Object).Count
if($myMatchCount -ge 1){
Write-Host "ファイル名="$NewFilename"が重複するので変換を中止します。"
exit
}
$NewFilename = $NewFilename + $_.extension
Write-Host $myCNT1" "$myCNT3" "$String1" "$NewFilename;
Rename-Item $_ $NewFilename;
$myCNT3++
}
Read-HostDefault "OK?" > $null # 入力待ち
}else {
Write-Host "拡張子("$myExt1_0")のファイル名変換を行いません(myExt1_1="$myExt1_1")"
}
$StartNo1 = $myCNT3 # 次の拡張子の開始番号
}
}
# 履歴をテキストファイルに出力
Write-Host "myCNT1/myLine2="$myCNT1"/"$myLine2"の履歴を書き込みます。`r`n"
$tmpStr1 = $MyFilePath1 + "," + $MyFlag1 + "," + $TargetName1 + "," + $StartNo
switch ($myCNT1){
# 初回は新規書き込み
1{Set-Content -Encoding UTF8 -LiteralPath $HistFile1 -Value $tmpStr1}
# 2回目以降は追記
Default{Add-Content -Encoding UTF8 -LiteralPath $HistFile1 -Value $tmpStr1}
}
$myCNT1++
$ErrFlg1 = $FALSE # エラーフラグをリセット
}
End_Process1 $CurrentPath1
https://cheese999.blog.ss-blog.jp/2021-08-23
に対して下記の変更をしました。
1.functionに対して、配列を引数として与え、配列を返り値として返す方法を
試すためにReferArrayList関数を追加。
配列を返すとき、カンマ演算子が必要でした。
【スクリプト】
## 定数 ##
# 文字コード変換DLL
$myDLL = "C:\abcde\PowerShell\ReadJEnc\dll\net47\Hnx8.ReadJEnc.dll"
# スクリプトがある場所
$ScriptPath1 = Split-Path $MyInvocation.MyCommand.Path -Parent
# 履歴ファイル
$HistFile1 = $ScriptPath1+"\FilePath2.txt"
# 拡張子ファイル
$ExtFile1 = $ScriptPath1+"\FileExtension2.txt"
# 変換対象ファイル名の拡張子を除いた部分の正規表現
$TargetName1="^.+_.+_.+_.+$"
# 関数:文字コードを表示
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()
#Write-Host $ChCode1
#$ChCode1.GetType().FullName
switch ($ChCode1){
"65001"{Write-Host "文字コードはUTF-8(65001)です。";break}
"932"{Write-Host "文字コードはShift-JIS(932)です。";break}
default{Write-Host "文字コードは不明です。";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]
}
# 関数:ファイルの存在確認
Function myFFileExist1($myFileText1, [ref]$myFilePath1) {
# $myFileText1 : ファイルを表す文字列
# $myFilePath1 : ファイルパス
# 返り値:true/false = ファイルが存在する/しない
$myFilePath2 = $myFilePath1.Value
# Write-Host "`$myFilePath2="$myFilePath2
[String]$myString1 = $myFileText1 + "?"
$myFilePath2 = Read-HostDefault $myString1 $myFilePath2
if(-Not(Test-Path $myFilePath2)){
$myString1 = $myFileText1 + "が存在しません。"
Write-Host $myString1
Write-Host "ファイルパス="$myFilePath2
Return $FALSE
}else{
$myFilePath1.Value = $myFilePath2
Return $TRUE
}
}
# 関数:文字コード判別
Function myMojiCode1($Name1){
If($Name1.IndexOf("ShiftJIS") -ge 0){
$myMojiCoding1 = "Default"
}ElseIf($Name1.IndexOf("UTF-8") -ge 0){
$myMojiCoding1 = "UTF8"
}ElseIf($Name1.IndexOf("EUCJP") -ge 0){
$myMojiCoding1 = -1
}ElseIf($Name1.IndexOf("ASCII") -ge 0){
$myMojiCoding1 = "ASCII"
}Else{
$myMojiCoding1 = -1
}
Return $myMojiCoding1
}
# 関数:英数字1文字をランダムに発生(a-z,A-Z,0-9)
Function myRnd1Char($myMode1){
if($myMode1 -eq 1){
# 英字(a-z,A-Z)
$myCharCode1 = Get-Random -Maximum 51 -Minimum 0
}else{
# 英数字(a-z,A-Z,0-9)
$myCharCode1 = Get-Random -Maximum 61 -Minimum 0
}
if(($myCharCode1 -ge 0) -and ($myCharCode1 -le 25)){
# 英字(A-Z)
$myCharCode1 = $myCharCode1 + 65
}elseif(($myCharCode1 -ge 26) -and ($myCharCode1 -le 51)){
# 英字(a-z)
$myCharCode1 = $myCharCode1 + 71
}elseif(($myCharCode1 -ge 52) -and ($myCharCode1 -le 61)){
# 数字(0-9)
$myCharCode1 = $myCharCode1 - 4
}
$encoding_wk = [system.Text.Encoding]::GetEncoding("ASCII")
$myChar1 = $encoding_wk.GetChars($myCharCode1)
Return $myChar1
}
# 関数:英数字のランダム文字列を発生(a-z,A-Z,0-9)
Function myRndStr1($myLength1){
# $myLength1 : 文字列長
$tmpName1 = myRnd1Char(1) # 1文字目は英字
[int]$myLength2 = $myLength1 - 1
if($myLength2 -ge 1){
for($myCNT3=1;$myCNT3 -le $myLength2;$myCNT3++){
$tmpName1 += myRnd1Char(2) # 2-n文字目は英数字
}
}
Return $tmpName1
}
# 関数:配列を受け取る
function ReferArrayList{
param(
[Parameter(Mandatory=$true)]
[object[,]]$myExt1, # 拡張子(配列)
[int]$numCol1 # 拡張子配列の列数
)
# $myExt1.GetType()
$RowLength1 = $myExt1.Length # 行数
$RowLength1 = $RowLength1 / $numCol1 # 行数 / 列数
Write-Host "RowLength1="$RowLength1
Write-Host "numCol1="$numCol1
for($i=0; $i -lt $RowLength1; $i++){
$tmpString1 = "myExt1[" + $i + "]="
for($j=0; $j -lt $numCol1; $j++){
$tmpString1 += $myExt1[@($i, $j)] + " "
}
Write-Host $tmpString1
}
$myExt2 = New-Object "object[,]" $RowLength1,$numCol1
$myExt2 = $myExt1
for($i=0; $i -lt $RowLength1; $i++){
$tmpString1 = "myExt2[" + $i + "]="
for($j=0; $j -lt $numCol1; $j++){
$tmpString1 += $myExt2[@($i, $j)] + " "
}
Write-Host $tmpString1
}
# $myExt2.GetType()
return ,$myExt2
}
# 関数:終了処理
Function End_Process1($CurrentPath1){
# 現在のパス
Write-Host "現在のパス(Get-Location)"
Get-Location
# 入力待ち
Read-HostDefault "OK?" > $null
# スクリプト実行前のパスに戻る
Write-Host "スクリプト実行前のパスに戻ります。"
Set-Location $CurrentPath1
# 現在のパス
Write-Host "現在のパス(Get-Location):スクリプト実行前"
Get-Location
write-host "文字コードをShift-JIS(932)に変更します。"
# 入力待ち
Read-HostDefault "OK?" > $null
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
}
# ここから本体コード
# DLLを読み込み
# Write-Host "`$myDLL="$myDLL
$myAnswer1 = myFFileExist1 -myFileText1 "文字コード変換DLL" -myFilePath1 ([ref]$myDLL)
if($myAnswer1 -eq $FALSE){exit} # DLLが存在しない場合は終了
[Reflection.Assembly]::LoadFile($myDLL) > $null
[int]$numCol1 = 3 # 拡張子ファイルの列数
# 拡張子ファイルを読み込み
$myAnswer1 = myFFileExist1 -myFileText1 "拡張子ファイル" -myFilePath1 ([ref]$ExtFile1)
if($myAnswer1 -eq $FALSE){exit} # DLLが存在しない場合は終了
# 拡張子ファイルの文字コード確認
$file=Get-Item $ExtFile1
$reader=new-object Hnx8.ReadJEnc.FileReader($file)
[String]$ReaderName1 = $reader.Read($file).Name
Write-Host "`$reader.Read(`$file).Name="$ReaderName1
$myMojiCoding1 = myMojiCode1($ReaderName1)
Write-Host "`$myMojiCoding1="$myMojiCoding1
$myLine1 = (Get-Content -LiteralPath $ExtFile1|Measure-Object -Line).Lines
Write-Host "拡張子ファイルの行数="$myLine1
If($myMojiCoding1 -eq -1){
# 拡張子ファイルの文字コードが不明な場合
Write-Host "拡張子ファイルの文字コードが不明です。"
exit
}Else{
# 拡張子ファイルの文字コードが明確な場合
# 拡張子変数の配列宣言
$myExt1 = New-Object "object[,]" $myLine1,$numCol1
$myExt2 = New-Object "object[,]" $myLine1,$numCol1
$myCNT4 = 0 # 拡張子カウンタ
$Str_array1 = @() # 配列初期化
foreach($tmpExt1 in Get-Content $ExtFile1 -Encoding $myMojiCoding1){
$Str_array1 = $tmpExt1 -Split ",";
$myExt1[$myCNT4,0] = $Str_array1[0] # 拡張子(変更前)
$myExt1[$myCNT4,1] = $Str_array1[1] # 0/1 = ファイル名変更しない/する
$myExt1[$myCNT4,2] = $Str_array1[2] # ダミー
$myExt1_0 = $myExt1[@($myCNT4,0)]
$myExt1_1 = $myExt1[@($myCNT4,1)]
$myCNT4_1 = $myCNT4 + 1
Write-Host "`$myExt1("$myCNT4_1"/"$myLine1")="$myExt1_0","$myExt1_1
$myCNT4++
}
}
# write-host "myExt1.GetType()="$myExt1.GetType()
$myExt2 = ReferArrayList -myExt1 $myExt1 -numCol1 $numCol1
for($i=0; $i -lt $myLine1; $i++){
$tmpString1 = "myExt2[" + $i + "]="
for($j=0; $j -lt $numCol1; $j++){
$tmpString1 += $myExt2[@($i, $j)] + " "
}
Write-Host $tmpString1
}
Read-HostDefault "OK?" > $null # 入力待ち
# 文字コードをUTF-8に変更
chcp 65001
# 文字コードを表示
myFShChrCd1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
Write-Host "スクリプトがある場所="$ScriptPath1
Read-HostDefault "OK?" > $null # 入力待ち
# 履歴変数の配列宣言
$PrevPath1 = @()
# 履歴ファイル
$myAnswer1 = myFFileExist1 -myFileText1 "履歴ファイル" -myFilePath1 ([ref]$HistFile1)
if($myAnswer1 -eq $FALSE){
# 履歴ファイルが存在しない
# $PrevPath1 += $CurrentPath1 # 履歴変数にカレントパスを追加
exit # 強制終了
}else{
# 履歴ファイルが存在する場合
# 履歴ファイルの文字コード確認
$file=Get-Item $HistFile1
$reader=new-object Hnx8.ReadJEnc.FileReader($file)
[String]$ReaderName1 = $reader.Read($file).Name
Write-Host "`$reader.Read(`$file).Name="$ReaderName1
$myMojiCoding1 = myMojiCode1($ReaderName1)
Write-Host "`$myMojiCoding1="$myMojiCoding1
$myLine2 = (Get-Content -LiteralPath $HistFile1|Measure-Object -Line).Lines
Write-Host "履歴ファイルの行数="$myLine2
If($myMojiCoding1 -eq -1){
# 履歴ファイルの文字コードが不明な場合
Write-Host "履歴ファイルの文字コードが不明です。"
# $PrevPath1 += $CurrentPath1 # 履歴変数にカレントパスを追加
exit # 強制終了
}Else{
# 履歴ファイルの文字コードが明確な場合
# 履歴ファイルを履歴変数(配列)に読み込み
# $PrevPath1=Get-Content $HistFile1 -totalcount 1 -Encoding $myMojiCoding1
# $OutputEncoding = [console]::OutputEncoding;
# Write-Host "`$PrevPath1=$PrevPath1"
$PrevPath1=(Get-Content $HistFile1 -Encoding $myMojiCoding1) -as [string[]]
}
}
$Str_array1 = @() # 文字列配列
[int]$myCNT1 = 1 # 履歴カウンタ(foreachループ)
$ErrFlg1 =$FALSE # エラーフラグをリセット
# 履歴の数だけ繰り返し
foreach ($MyPrev1 in $PrevPath1){
$Str_array1 = $MyPrev1 -Split "," # 履歴をカンマで区切る
$MyFilePath1 = $Str_array1[0] # 履歴0 : ファイルがあるフォルダ
$MyFlag1 = $Str_array1[1] # 履歴1 : 対話/バッチ = 0/1
$TargetName1 = $Str_array1[2] # 履歴2 : 変換対象ファイル名
[String]$StartNo = $Str_array1[3] # 履歴3 : ファイル名の連番の開始番号
Write-Host "履歴番号(myCNT1/myLine2)=($myCNT1/$myLine2)"
Write-Host "MyFilePath1="$MyFilePath1
Write-Host "MyFlag1="$MyFlag1
Write-Host "TargetName1="$TargetName1
Write-Host "StartNo="$StartNo
$tmpStr1 = $MyFilePath1.Substring(0,1)
# Write-Host "tmpStr1="$tmpStr1
if($tmpStr1 -eq "#"){
Write-Host "履歴の頭文字が#なので変換をスキップします。"
$ErrFlg1 = $TRUE
}
Read-HostDefault "OK?" > $null # 入力待ち
if(($MyFlag1 -eq 0) -and ($ErrFlg1 -eq $FALSE)){
# 変換対象ファイル名を入力
$TargetName1 = Read-HostDefault "変換対象ファイル名?" $TargetName1
# ファイルがあるフォルダを入力
$MyFilePath1 = Read-HostDefault "($myCNT1/$myLine2)ファイル名変更の対象ファイルがあるフォルダ?" $MyFilePath1
}
if($ErrFlg1 -eq $FALSE){
if(-Not(Test-Path $MyFilePath1)){
# フォルダが存在しない
Write-Host "フォルダが存在しません。"
$ErrFlg1 = $TRUE # エラーフラグをセット
}else{
# フォルダが存在する場合
Set-Location -LiteralPath $MyFilePath1 # ファイルがあるフォルダへ移動
[int]$TotalCount1 = 0 # 総ファイル数
[int]$myCNT4 = 0 # 拡張子カウンタ
$myExtCount1 = @() # 拡張子ごとのファイル数の配列宣言
for($myCNT4 = 0; $myCNT4 -lt $myLine1; $myCNT4++){
$myExt1_0 = $myExt1[@($myCNT4,0)] # 拡張子
$myExt1_1 = $myExt1[@($myCNT4,1)] # 0/1 = ファイル名変更しない/する
$myExtCount1 += (Get-ChildItem -File *.$myExt1_0|Where-Object{$_.Name -match $TargetName1}|Measure-Object).Count # 拡張子ごとのファイル数を配列に追加
$j=$myExtCount1[$myCNT4] # 拡張子ごとのファイル数を作業用変数に格納
if($myExt1_1 -eq 1){$TotalCount1 += $j} # 拡張子ごとのファイル数を総ファイル数に足す
$myCNT4_1 = $myCNT4+1
Get-ChildItem -File *.$myExt1_0|Where-Object{$_.Name -match $TargetName1}
Write-Host $myExt1_0"("$myCNT4_1"/"$myLine1")のファイル数="$j"[myExt1_1="$myExt1_1"]"
}
Write-Host "変換対象ファイル数="$TotalCount1
# 対象ファイル数が0の場合、エラーフラグをセット
if($TotalCount1 -eq 0){
Write-Host "変換対象ファイルがありません。"
$ErrFlg1 = $TRUE # エラーフラグをセット
}else{
switch($MyFlag1){
0{$myINPUT1 = "N"} # 対話
1{$myINPUT1 = "Y"} # バッチ
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myInput1 = Read-HostDefault "ファイル名を変更しますか(Y/N)?" $myInput1
}
# Y以外なら、エラーフラグをセット
if($myInput1 -ne "Y"){
$ErrFlg1 = $TRUE
Write-Host "Y以外が入力されました。"
}
}
}
}
# Write-Host "ErrFlg1="$ErrFlg1
# エラーフラグが偽なら、ファイル名の連番の開始番号を入力
if($ErrFlg1 -eq $FALSE){
if($MyFlag1 -eq 0){
[String]$StartNo = Read-HostDefault "ファイル名の連番の開始番号?" $StartNo
}
# ヌル判定
# if ([String]::IsNullOrEmpty($StartNo)){
# Write-Host "開始番号に何も入力されなかったので、開始番号=1とします。"
# [string]$StartNo = "1"
# Read-HostDefault "OK?" > $null # 入力待ち
# }
# 変換後の整数変数
[Int]$StartNo1 = 0
# 整数変換
[Bool]$Result1 = [int]::TryParse($StartNo, [ref]$StartNo1)
if($Result1 -eq $FALSE){
$ErrFlg1 = $TRUE # エラーフラグをセット
Write-Host "開始番号="$StartNo" に整数以外が入力されました。"
Read-HostDefault "OK?" > $null # 入力待ち
}
}
# エラーフラグが偽なら、新しいファイル名の確認
if($ErrFlg1 -eq $FALSE){
# $Str_array1 = $TargetName1 -Split "_";
[String]$String1 = "新しいファイル名:" + "xxx" + "_" + "xxx" + "_" + "xxx"
$String1 = $String1 + "_" + $StartNo1.tostring("000") + ".xxx でよろしいですか(Y/N)?"
$myINPUT1 = "Y"
if($MyFlag1 -eq 0){$myInput1 = Read-HostDefault $String1 "N"}
if($myInput1 -ne "Y"){
$ErrFlg1 = $TRUE # エラーフラグをセット
Write-Host "Y以外が入力されました。"
}
}
# エラーフラグが偽なら、ファイル名変換と履歴書込を実施
if($ErrFlg1 -eq $FALSE){
# ???_???_???_001.???, ???_???_???_002.??? と昇順で名前を付け替える
Write-Host "番号 変更前 変更後(1回目)"
for($myCNT4 = 0; $myCNT4 -lt $myLine1; $myCNT4++){
$myExt1_0 = $myExt1[@($myCNT4,0)] # 拡張子
$myExt1_1 = $myExt1[@($myCNT4,1)] # 0/1 = ファイル名変更しない/する
if($myExt1_1 -eq 1){
Get-ChildItem -File *.$myExt1_0| Where-Object{$_.Name -match $TargetName1} | Sort-Object Name | ForEach-Object {$myCNT3 = $StartNo1} {
$String1 = [System.IO.Path]::GetFileNameWithoutExtension($_); # 拡張子を除いた元のファイル名
$Str_array1 = $String1 -Split "_"; # アンダーバー(_)で分割、配列に代入
$NumX = 2 - $Str_array1.Length
# Write-Host "NumX="$NumX
for($i=0; $i -le $NumX; $i++){
$Str_array1 += "x"
}
# Write-Host $Str_array1.Length
for($i=0; $i -le 2; $i++){
if([String]::IsNullOrEmpty($Str_array1[$i])){
$Str_array1[$i] = "x"
}
}
$String1 = $String1 + $_.extension
$myRndStr1 = myRndStr1(3) # 3文字のランダム文字列
$NewFilename = $Str_array1[0] + "_" + $Str_array1[1] + "_" + $Str_array1[2] + "_" + $myCNT3.tostring("000") + $myRndStr1
$myMatchPattern1 = "^" + $NewFilename + "$"
# 重複ファイル数
$myMatchCount = (Get-ChildItem|Where-Object {$_.Name -match $myMatchPattern1}|Measure-Object).Count
if($myMatchCount -ge 1){
Write-Host "ファイル名="$NewFilename"が重複するので変換を中止します。"
exit
}
$NewFilename = $NewFilename + $_.extension
Write-Host $myCNT1" "$myCNT3" "$String1" "$NewFilename;
Rename-Item $_ $NewFilename;
$myCNT3++
}
Read-HostDefault "OK?" > $null # 入力待ち
Write-Host "番号 変更前 変更後(2回目)"
Get-ChildItem -File *.$myExt1_0| Where-Object{$_.Name -match $TargetName1} | Sort-Object Name | ForEach-Object {$myCNT3 = $StartNo1} {
$String1 = [System.IO.Path]::GetFileNameWithoutExtension($_);
$Str_array1 = $String1 -Split "_";
$String1 = $String1 + $_.extension
$NewFilename = $Str_array1[0] + "_" + $Str_array1[1] + "_" + $Str_array1[2] + "_" + $myCNT3.tostring("000")
$myMatchPattern1 = "^" + $NewFilename + "$"
# 重複ファイル数
$myMatchCount = (Get-ChildItem|Where-Object {$_.Name -match $myMatchPattern1}|Measure-Object).Count
if($myMatchCount -ge 1){
Write-Host "ファイル名="$NewFilename"が重複するので変換を中止します。"
exit
}
$NewFilename = $NewFilename + $_.extension
Write-Host $myCNT1" "$myCNT3" "$String1" "$NewFilename;
Rename-Item $_ $NewFilename;
$myCNT3++
}
Read-HostDefault "OK?" > $null # 入力待ち
}else {
Write-Host "拡張子("$myExt1_0")のファイル名変換を行いません(myExt1_1="$myExt1_1")"
}
$StartNo1 = $myCNT3 # 次の拡張子の開始番号
}
}
# 履歴をテキストファイルに出力
Write-Host "myCNT1/myLine2="$myCNT1"/"$myLine2"の履歴を書き込みます。`r`n"
$tmpStr1 = $MyFilePath1 + "," + $MyFlag1 + "," + $TargetName1 + "," + $StartNo
switch ($myCNT1){
# 初回は新規書き込み
1{Set-Content -Encoding UTF8 -LiteralPath $HistFile1 -Value $tmpStr1}
# 2回目以降は追記
Default{Add-Content -Encoding UTF8 -LiteralPath $HistFile1 -Value $tmpStr1}
}
$myCNT1++
$ErrFlg1 = $FALSE # エラーフラグをリセット
}
End_Process1 $CurrentPath1
2021-08-29 11:01
ヤバイぜ!(10)
コメント(1)
ヤバイぜ! ありがとうございます(^_0)ノ
by cheese999 (2021-09-02 07:02)