PowerShell小僧:ファイル名の一括置換(その2) [コンピューター]
前回までのファイル名の一括置換スクリプトは、ファイル名をそっくり置換するものでしたが、元のファイル名の一部を残して置換するスクリプトを作りました。
元のファイル名:Ab2des8S_???_???_xxx.???
で、xxx以外の部分は残して、xxxの部分を連番の数字に置換するものです。元のファイル名を'_'で分割して配列に取り込み、xxxの部分だけ、連番の数字と置換しています。
【コード】
# 関数:文字コードを表示
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"{echo "文字コードはUTF-8(65001)です。";break}
"932"{echo "文字コードはShift-JIS(932)です。";break}
default{echo "文字コードは不明です。";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]
}
# ここから本体コード
# 変換対象ファイル名
$TargetName1="Ab2des8S_*_*_*.*"
# 文字コードをUTF-8に変更
chcp 65001
# 文字コードを表示
myFShChrCd1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
$INPUT=Read-HostDefault "OK?"
# ファイルがあるフォルダを入力
$MyFilePath1 = Read-HostDefault "ファイルがあるフォルダ?" $CurrentPath1
# フォルダが存在しない場合、終了
if(-Not(Test-Path $MyFilePath1)){
Write-Host "フォルダが存在しません。"
Exit
}
# ファイルがあるフォルダへ移動
cd -LiteralPath $MyFilePath1
# ファイル名の一覧を表示
Write-Host "フォルダ内のファイル一覧です。"
Get-ChildItem
# 入力待ち
$INPUT = Read-HostDefault "OK?"
echo "変更対象のファイル名(変更前)です。"
Get-ChildItem -Path $TargetName1
# 入力待ち
$INPUT = Read-HostDefault "ファイル名を変更しますか(Y/N)?" "N"
if($INPUT -ne "Y"){
# Y以外なら、処理中止
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
echo "処理を中断しました。"
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# ファイル名の一覧を表示
Get-ChildItem
exit
}
# ファイル名の連番の開始番号を入力
[String]$StartNo = Read-HostDefault "ファイル名の連番の開始番号?" 1
# ヌル判定
# if ([String]::IsNullOrEmpty($StartNo)){
# Write-Host "開始番号に何も入力されなかったので、開始番号=1とします。"
# [string]$StartNo = "1"
# 入力待ち
# $INPUT = Read-Host "OK?"
# }
# 変換後の整数変数
[Int]$StartNo1 = 0
# 整数変換
[Bool]$Result1 = [int]::TryParse($StartNo, [ref]$StartNo1)
if($Result1 -eq $FALSE){
Write-Host "開始番号="$StartNo" に整数以外が入力されたので終了します。"
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
echo "処理を中断しました。"
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# ファイル名の一覧を表示
Get-ChildItem
exit
}
# 新しいファイル名の確認
[String]$String1 = "新しいファイル名:Ab2des8S_xxx_xxx_" + $StartNo1.tostring("000") + ".xxx でよろしいですか(Y/N)?"
$INPUT = Read-HostDefault $String1 "N"
if($INPUT -eq "Y"){
# 配列
$Str_array1 = @()
# Ab2des8S_???_???_001.???, Ab2des8S_???_???_002.??? と昇順で名前を付け替える
Write-Host "番号 変更前 変更後"
Get-ChildItem -Path $TargetName1 | Sort Name | ForEach-Object {$i = $StartNo1} {
$String1 = [System.IO.Path]::GetFileNameWithoutExtension($_);
$Str_array1 = $String1 -Split "_";
$NewFilename = $Str_array1[0] + "_" + $Str_array1[1] + "_" + $Str_array1[2] + "_" + $i.tostring("000") + $_.extension
Write-Host $i" "$String1" "$NewFilename;
Rename-Item $_ $NewFilename;
$i++
}
# 入力待ち
$INPUT = Read-HostDefault "OK?"
}else{
echo "ファイル名の変更を中止します。"
}
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# ファイル名の一覧を表示
Write-Host "フォルダ内のファイル一覧"
Get-ChildItem
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# スクリプト実行前のパスに戻る
Set-Location $CurrentPath1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
元のファイル名:Ab2des8S_???_???_xxx.???
で、xxx以外の部分は残して、xxxの部分を連番の数字に置換するものです。元のファイル名を'_'で分割して配列に取り込み、xxxの部分だけ、連番の数字と置換しています。
【コード】
# 関数:文字コードを表示
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"{echo "文字コードはUTF-8(65001)です。";break}
"932"{echo "文字コードはShift-JIS(932)です。";break}
default{echo "文字コードは不明です。";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]
}
# ここから本体コード
# 変換対象ファイル名
$TargetName1="Ab2des8S_*_*_*.*"
# 文字コードをUTF-8に変更
chcp 65001
# 文字コードを表示
myFShChrCd1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
$INPUT=Read-HostDefault "OK?"
# ファイルがあるフォルダを入力
$MyFilePath1 = Read-HostDefault "ファイルがあるフォルダ?" $CurrentPath1
# フォルダが存在しない場合、終了
if(-Not(Test-Path $MyFilePath1)){
Write-Host "フォルダが存在しません。"
Exit
}
# ファイルがあるフォルダへ移動
cd -LiteralPath $MyFilePath1
# ファイル名の一覧を表示
Write-Host "フォルダ内のファイル一覧です。"
Get-ChildItem
# 入力待ち
$INPUT = Read-HostDefault "OK?"
echo "変更対象のファイル名(変更前)です。"
Get-ChildItem -Path $TargetName1
# 入力待ち
$INPUT = Read-HostDefault "ファイル名を変更しますか(Y/N)?" "N"
if($INPUT -ne "Y"){
# Y以外なら、処理中止
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
echo "処理を中断しました。"
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# ファイル名の一覧を表示
Get-ChildItem
exit
}
# ファイル名の連番の開始番号を入力
[String]$StartNo = Read-HostDefault "ファイル名の連番の開始番号?" 1
# ヌル判定
# if ([String]::IsNullOrEmpty($StartNo)){
# Write-Host "開始番号に何も入力されなかったので、開始番号=1とします。"
# [string]$StartNo = "1"
# 入力待ち
# $INPUT = Read-Host "OK?"
# }
# 変換後の整数変数
[Int]$StartNo1 = 0
# 整数変換
[Bool]$Result1 = [int]::TryParse($StartNo, [ref]$StartNo1)
if($Result1 -eq $FALSE){
Write-Host "開始番号="$StartNo" に整数以外が入力されたので終了します。"
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
echo "処理を中断しました。"
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# ファイル名の一覧を表示
Get-ChildItem
exit
}
# 新しいファイル名の確認
[String]$String1 = "新しいファイル名:Ab2des8S_xxx_xxx_" + $StartNo1.tostring("000") + ".xxx でよろしいですか(Y/N)?"
$INPUT = Read-HostDefault $String1 "N"
if($INPUT -eq "Y"){
# 配列
$Str_array1 = @()
# Ab2des8S_???_???_001.???, Ab2des8S_???_???_002.??? と昇順で名前を付け替える
Write-Host "番号 変更前 変更後"
Get-ChildItem -Path $TargetName1 | Sort Name | ForEach-Object {$i = $StartNo1} {
$String1 = [System.IO.Path]::GetFileNameWithoutExtension($_);
$Str_array1 = $String1 -Split "_";
$NewFilename = $Str_array1[0] + "_" + $Str_array1[1] + "_" + $Str_array1[2] + "_" + $i.tostring("000") + $_.extension
Write-Host $i" "$String1" "$NewFilename;
Rename-Item $_ $NewFilename;
$i++
}
# 入力待ち
$INPUT = Read-HostDefault "OK?"
}else{
echo "ファイル名の変更を中止します。"
}
# 文字コードをShift-JISに変更
chcp 932
# 文字コードを表示
myFShChrCd1
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# ファイル名の一覧を表示
Write-Host "フォルダ内のファイル一覧"
Get-ChildItem
# 入力待ち
$INPUT = Read-HostDefault "OK?"
# スクリプト実行前のパスに戻る
Set-Location $CurrentPath1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
参考。。
https://www.atmarkit.co.jp/ait/articles/1411/07/news133.html
by cheese999 (2021-05-01 06:38)
ヤバイぜ! ありがとうございます(^_0)ノ
PowerShell、簡単な様で難しいです。。。
by cheese999 (2021-05-02 06:58)