PowerShell小僧:zip解凍 [コンピューター]
PowerShell小僧:ファイル名の一括置換(改15)
https://cheese999.blog.ss-blog.jp/2021-09-15
に以下の変更をしました。
1.置換対象ファイルはzip圧縮されているものを解凍して置換する
【参考にした情報】
・「PowerShellの関数を手続き的に書きたい(出力が戻り値に含まれてしまう問題)」
https://tyru.hatenablog.com/entry/2015/11/08/004204
【Extract1.ps1】
# 7-Zip 解凍
# 日本語を含むスクリプトを実行すると文字化けが発生する。
# 原因:VisualStudioCodeのUTF-8はBOM無し、PowerShellのUTF-8はBOMありのため
# 対策:スクリプトをUTF-8(BOMあり)で保存する
# パラメータ
Param(
[Parameter(Mandatory=$true)]
[String]$InZip1 # 解凍前のZipファイル
)
# 関数:文字コードを表示
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
# 定数
# 7-Zipのパス
$myPath1 = "C:\Program Files\7-Zip"
# スクリプト本体
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
# 7-Zipのフォルダに移動
Set-Location -Path $myPath1
$myResult1 = $true
# 解凍前zipファイルの存在確認
if (-not(Test-Path($InZip1))) {
Write-Host $InZip1"がありません。"
$myResult1 = $false
}
# Zipファイル内のフォルダ名
if ($myResult1 -eq $true) {
./7z l $InZip1 | Tee-Object -Variable Result7Zip # zipファイルの中身を確認
$myList1 = ($Result7Zip | select-string -pattern "D\.\.\.\.") # 解凍後に出力されるフォルダの行を抽出
$Str_array1 = @() # 配列初期化
$Str_array1 = $myList1 -split " +" # 空白で分割
$myArrayLast1 = $Str_array1.Count - 1 # 配列の最後
$myOutFolder1 = Split-Path $InZip1 # 解凍先フォルダ(解凍前のzipファイルの親フォルダ)
$myOutFolder2 = $myOutFolder1 + "\" + ($Str_array1[$myArrayLast1]) # 解凍で出力されるフォルダ
$myOption1 = "-o" + $myOutFolder1 # 7zipコマンドの出力フォルダ
Write-Host "myList1="$myList1
Write-Host "myArrayLast1="$myArrayLast1
Write-host "Str_array1["$myArrayLast1"]="($Str_array1[$myArrayLast1])
Write-Host "myOutFolder1="$myOutFolder1
Write-Host "myOutFolder2="$myOutFolder2
Write-host "myOption1="$myOption1
# 解凍後フォルダの存在確認
if (Test-Path($myOutFolder2)) {
Write-Host $myOutFolder2"が既にあります。"
$myResult1 = $false
}
}
Read-HostDefault "OK?" > $null # 入力待ち
if ($myResult1 -eq $true) {
# zipファイルを解凍
./7z x $myOption1 $InZip1 | Tee-Object -Variable Result7Zip
# 7-Zipの解凍は成功したか?
$myResult1 = ($Result7Zip | Select-String -Pattern 'Everything is Ok' -CaseSensitive -Quiet)
# 圧縮成功していたら、元zipファイルを削除
$myString1 = "を削除しました 。"
if($myResult1 -eq $true){
Remove-Item -Path $InZip1
$myString1 = $InZip1+$myString1
Write-Host $myString1
}
}
# 終了
# 実行前のフォルダに戻る
Set-Location $CurrentPath1
# ドットソース演算子の{}を抜ける
Return
}|Out-Null # ドットソース演算子の{}内の標準出力は戻り値に含めない
# 以下、戻り値
Return $myResult1, $myOutFolder2
【ChangeName3_UTF8.ps1】
## 定数 ##
# 文字コード変換DLL
$myDLL = "C:\abcde\PowerShell\ReadJEnc\dll\net47\Hnx8.ReadJEnc.dll"
# スクリプトがある場所
$ScriptPath1 = Split-Path $MyInvocation.MyCommand.Path -Parent
# 履歴ファイル
$HistFile1 = $ScriptPath1+"\FilePath1.txt"
# 拡張子ファイル
$ExtFile1 = $ScriptPath1+"\FileExtension1.txt"
# JPGファイル
# $JpgExt_array = @("jpeg", "jpe", "jfif", "jpg_large")
# 関数:文字コードを表示
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]
}
# 関数:終了処理
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
}
# 関数:文字コード判別
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
}
# 関数:区切り文字の次の文字から最終文字までを切り出す
Function myStrCut1($MyFilePath1,$MyLastIndex){
# 元の文字列の長さ
[int]$MyLength1 = $MyFilePath1.Length
# ファイルパスの切り出し開始文字
[int]$MyStart1 = $MyLastIndex + 1
Write-Host "MyStart1="$MyStart1
# 切り出す文字数
[int]$MyLength2 = $MyLength1 - $MyStart1
Write-Host "MyLength2="$MyLength2
# ファイルパスの区切り文字"_"の次の文字から最終文字までを切り出す
[string]$PathL3 = $MyFilePath1.Substring($MyStart1, $MyLength2)
# 切り出した文字数が10文字を超えたら、10文字に切り詰める
if($MyLength2 -gt 10){
[int]$MyStart1 = $MyLength2 - 10
[string]$PathL3 = $PathL3.Substring($MyStart1, 10)
}
# アンダーバーを連結
$PathL3 += "_"
# Write-Host "`$PathL3="$PathL3
return $PathL3
}
# 関数:英数字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 myFExtChnge1($myExt1,$myExt2,$myExtCount1,$MyFlag1,$ChgExt1){
# myExt1 : 変更前の拡張子
# myExt2 : 変更後の拡張子
# myExtCount1 : 拡張子ごとのファイル数
# MyFlag1 : 履歴1 : 対話/バッチ = 0/1
# ChgExt1 : 履歴7 : 0/1 = 拡張子を変更しない/変更する
switch($ChgExt1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myMessage1 = "拡張子("+$myExt1+")[ファイル数="+$myExtCount1+"]を拡張子("+$myExt2+")に変更しますか(Y/N)?"
$myINPUT1 = Read-HostDefault $myMessage1 $myINPUT1
}
if($myINPUT1 -eq "Y"){
$myExt1a = '\.'+$myExt1+'$'
$myExt2a = '.'+$myExt2
$myExt1b ='*.'+$myExt1
Get-ChildItem -File $myExt1b | Rename-Item -NewName { $_ -replace $myExt1a,$myExt2a }
$myMessage1 = "拡張子("+$myExt1+")[ファイル数="+$myExtCount1+"]を拡張子("+$myExt2+")に変更しました。"
Write-Host $myMessage1
}
}
# 関数:ファイルの存在確認
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
}
}
# Zip圧縮
function myFCompZip2 {
param (
[Parameter(Mandatory=$true)]
[String]$InFolderName1,
[String]$OutZipName1
)
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8' # なくても動くが日本語を含む出力が文字化けする
$WorkDirectory1 = "C:\Document\PowerShell\work"
Set-Location $WorkDirectory1
$commandPath = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
# $InFolderName1="C:\abcde\tmp\ああああ_YYx"
# $OutZipName1 = "C:\abcde\tmp\YYx.zip"
$ScriptFile1 = "C:\abcde\PowerShell\Compress1.ps1 -InFolder1 $InFolderName1 -OutZip1 $OutZipName1"
$Argument1 = "-Command $ScriptFile1"
$stdErrLogTmp = ".\stderr.log"
$stdOutLogTmp = ".\stdout.log"
$myResult1 = $true
# 圧縮前フォルダの存在確認
if (-not(Test-Path($InFolderName1))) {
Write-Host $InFolderName1"がありません。"
$myResult1 = $false
}
# 圧縮後ファイルの存在確認
if (Test-Path($OutZipName1)) {
Write-Host $OutZipName1"が既にあります。"
$myResult1 = $false
}
if ($myResult1 -eq $true) {
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;
}
}
}
Write-Host "`$myResult1=$myResult1"
}
# メイン部分
# DLLを読み込み
$myAnswer1 = myFFileExist1 -myFileText1 "文字コード変換DLL" -myFilePath1 ([ref]$myDLL)
if($myAnswer1 -eq $FALSE){exit} # DLLが存在しない場合は終了
[Reflection.Assembly]::LoadFile($myDLL) > $null
# 拡張子ファイルを読み込み
$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,3
# 拡張子ごとのファイル数の配列宣言
$myExtCount1 = @()
$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 = 拡張子変更(jpg)しない/する
$myExt1[$myCNT4,2] = $Str_array1[2] # 拡張子(変更後)
$myExt1_0 = $myExt1[@($myCNT4,0)]
$myExt1_1 = $myExt1[@($myCNT4,1)]
$myExt1_2 = $myExt1[@($myCNT4,2)]
$myCNT4_1 = $myCNT4 + 1
Write-Host "`$myExt1("$myCNT4_1"/"$myLine1")="$myExt1_0","$myExt1_1","$myExt1_2
$myCNT4++
}
# $myExtLine1 = $myExt1.Length # 拡張子変数の配列要素数
}
Read-HostDefault "OK?" > $null # 入力待ち
# 文字コードをUTF-8に変更
chcp 65001
# 文字コードを表示
myFShChrCd1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
Write-Host "スクリプトがある場所="$ScriptPath1
Read-HostDefault "OK?" > $null # 入力待ち
# 履歴変数の配列宣言
$PrevPath1 = @()
# エラーフラグをリセット
$ErrFlg1 =$FALSE
# 履歴ファイルの存在確認
$myAnswer1 = myFFileExist1 -myFileText1 "履歴ファイル" -myFilePath1 ([ref]$HistFile1)
if($myAnswer1 -eq $FALSE){exit} # 履歴ファイルが存在しない場合は終了
# 履歴ファイルの文字コード確認
$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[]]
}
# 履歴カウンタ
[int]$myCNT1 = 1
# 履歴の数だけ繰り返し
$Str_array1 = @() # 配列初期化
foreach ($MyPrev1 in $PrevPath1){
# 履歴をカンマで区切る
$Str_array1 = $MyPrev1 -Split ",";
# $MyFilePath1 = $Str_array1[0] # 履歴0 : ファイルがあるフォルダ
$myFilePath2 = $Str_array1[0] # 履歴0 : Zipファイルのパス
$MyFlag1 = $Str_array1[1] # 履歴1 : 対話/バッチ = 0/1
$NewFileName1 = $Str_array1[2] # 履歴2 : 新しいファイル名
[String]$StartNo = $Str_array1[3] # 履歴3 : ファイル名の連番の開始番号
$AddDate1 = $Str_array1[4] # 履歴4 : 0/1 = ファイル名に日付を追加しない/追加する
$AddYoubi1 = $Str_array1[5] # 履歴5 : 0/1 = ファイル名に曜日を追加しない/追加する
$AddTime1 = $Str_array1[6] # 履歴6 : 0/1 = ファイル名に時刻を追加しない/追加する
$ChgExt1 = $Str_array1[7] # 履歴7 : 0/1 = 拡張子を変更しない/変更する
Write-Host "履歴番号(myCNT1/myLine1)=($myCNT1/$myLine2)"
# Write-Host "MyFilePath1="$MyFilePath1
Write-Host "MyFilePath2="$MyFilePath2
Write-Host "MyFlag1="$MyFlag1
Write-Host "NewFileName1="$NewFileName1
Write-Host "StartNo="$StartNo
Write-Host "AddDate1="$AddDate1
Write-Host "AddYoubi1="$AddYoubi1
Write-Host "AddTime1="$AddTime1
Write-Host "ChgExt1="$ChgExt1
$tmpStr1 = $MyFilePath2.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)){
# $MyFilePath1 = Read-HostDefault "($myCNT1/$myLine2)ファイル名変更の対象ファイルがあるフォルダ?" $MyFilePath1
# }
# Zipファイルのパスを入力
if(($MyFlag1 -eq 0) -and ($ErrFlg1 -eq $FALSE)){
$MyFilePath2 = Read-HostDefault "($myCNT1/$myLine2)ファイル名変更の対象ファイルのZipファイル?" $MyFilePath2
}
if($ErrFlg1 -eq $FALSE){
if(-Not(Test-Path $MyFilePath2)){
# Zipファイルが存在しない
Write-Host "Zipファイル("$MyFilePath2")が存在しません。"
$ErrFlg1 = $TRUE
}else{
# # フォルダが存在する場合
# Zipファイルが存在する場合、解凍
Set-Location -LiteralPath $ScriptPath1
$myResult2 = .\Extract1.ps1 -InZip1 $MyFilePath2
if($myResult2[0] -eq $TRUE){
$MyFilePath1 = $myResult2[1]
# ファイルがあるフォルダへ移動
Set-Location -LiteralPath $MyFilePath1
# ファイル名の一覧を表示
Write-Host "変更前のファイル名です。"
Get-ChildItem
$myINPUT1 = "Y"
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "ファイル名を変更しますか(Y/N)?" "N"
}
}else{
$ErrFlg1 = $TRUE
}
}
}
if(($ErrFlg1 -eq $FALSE) -and ($myINPUT1 -eq "Y")){
# エラーフラグが偽、かつ、答えがYなら、以下実行
# ファイルパスの長さ
[int]$MyLength1 = $MyFilePath1.Length
Write-Host "MyLength1="$MyLength1
# ファイルパスの区切り文字"_"の位置
[int]$MyLastIndex1 = $MyFilePath1.LastIndexOf("_", $MyLength1 - 1)
Write-Host "`$MyLastIndex1="$MyLastIndex1
# ファイルパスの区切り文字"\"の位置
[int]$MyLastIndex2 = $MyFilePath1.LastIndexOf("`\", $MyLength1 - 1)
Write-Host "`$MyLastIndex2=$MyLastIndex2"
if(($MyLastIndex1 -eq -1) -And ($MyLastIndex2 -eq -1)){
# 区切り文字"_", "\"の両方が見つからない場合
# ファイルパスの切り出し開始文字を最終文字から2文字目にする
$MyLastIndex2 = $MyLength1 - 3 - 1
# ファイルパスの最終3文字を切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex2
}elseif(($MyLastIndex1 -ge 0) -And ($MyLastIndex2 -eq -1)){
# 区切り文字"_"だけ見つかった場合
# ファイルパスの最終"_"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex1
}elseif(($MyLastIndex1 -eq -1) -And ($MyLastIndex2 -ge 0)){
# 区切り文字"\"だけ見つかった場合
# ファイルパスの最終"\"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath11 $MyLastIndex2
}elseif(($MyLastIndex1 -ge 0) -And ($MyLastIndex2 -ge 0)){
# 区切り文字"_", "\"の両方が見つかった場合
if($MyLastIndex1 -gt $MyLastIndex2){
# 区切り文字"_"が"\"より後ろにある場合
# ファイルパスの最終"_"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex1
}else{
# 区切り文字"\"が"_"より後ろにある場合
# ファイルパスの最終"\"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex2
}
}
Write-Host "`$PathL3="$PathL3
# 新しいファイル名候補の\を_に変換
$PathL3 = $PathL3.replace("`\","_")
# 新しいファイル名を入力
if($MyFlag1 -eq 0){
[String]$NewFileName1 = Read-HostDefault "新しいファイル名?" $PathL3
}
# 日付をファイル名に追加
[String]$myDate1 = Get-Date -Format "yyyyMMdd"
switch($AddDate1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "日付($myDate1)をファイル名に追加しますか(Y/N)?" $myINPUT1
}
switch($myINPUT1){
Y{$AddDate1=1;$NewFileName2=$NewFileName1+$myDate1;$NewFileName2+="_"}
N{$AddDate1=0;$NewFileName2=$NewFileName1}
Default{$AddDate1=0;$NewFileName2=$NewFileName1}
}
# 曜日をファイル名に追加
[String]$myYoubi = (Get-Date).DayOfWeek
$myYoubi = $myYoubi.Substring(0,3)
switch($AddYoubi1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "曜日($myYoubi)をファイル名に追加しますか(Y/N)?" $myINPUT1
}
switch($myINPUT1){
Y{$AddYoubi1=1;$NewFileName2+=$myYoubi;$NewFileName2+="_"}
N{$AddYoubi1=0}
Default{$AddYoubi1=0}
}
# 時刻をファイル名に追加
# タイムゾーンを表示
$MyTimeZone = Get-CimInstance -Class Win32_TimeZone -Namespace "Root\CIMV2"
[int]$MyJisa = $MyTimeZone.Bias / 60
if($MyJisa -gt 0){[string]$myFugou1 = "+"}
elseif($MyJisa -eq 0){[string]$myFugou1 = ""}
elseif($MyJisa -lt 0){[string]$myFugou1 = "-"}
else{[string]$myFugou1 = "?"}
Write-Host "UTCとの時差="$myFugou1$MyJisa"時間"
Write-Host "タイムゾーン:"$MyTimeZone.Caption
[String]$myTime1 = Get-Date -Format "HHmmss"
switch($AddTime1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "時刻($myTime1)をファイル名に追加しますか(Y/N)?" $myINPUT1
}
switch($myINPUT1){
Y{$AddTime1=1;$NewFileName2+=$myTime1;$NewFileName2+="_"}
N{$AddTime1=0}
Default{$AddTime1=0}
}
# ファイル名の連番の開始番号を入力
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){
Write-Host "開始番号="$StartNo" に整数以外が入力されたのでスキップします。"
$ErrFlg1 = $TRUE
}
if($ErrFlg1 -eq $FALSE){
# 新しいファイル名の確認
$myINPUT1 = "Y"
if($MyFlag1 -eq 0){
[String]$String1 = "新しいファイル名:" + $NewFileName2 + $StartNo1.tostring("000") + ".jpg でよろしいですか(Y/N)?"
$myINPUT1 = Read-HostDefault $String1 "N"
}
}
if(($ErrFlg1 -eq $FALSE) -and ($myINPUT1 -eq "Y")){
# xxxxxxxxx_001.xxx, xxxxxxxxx_002.xxx と昇順で名前を付け替える
# 一時的な名前($tmpName1)を発生
$tmpName1 = myRndStr1(10) # 10文字
$tmpName1 += "_"
write-host "一時的なファイル名(`$tmpName1)=$tmpName1"
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
# 1回目の変換後にファイル名の重複が発生する場合は中止
# 検索パタン
$myPattern = "^" + $tmpName1 + "[0-9]{3}"
# 重複ファイル数
$myMatchCount = (Get-ChildItem|Where-Object {$_.Name -match $myPattern}|Measure-Object).Count
#Write-Host "`$myMatchCount=$myMatchCount"
if($myMatchCount -ge 1){
Write-Host "ファイル名の重複が発生するため、ファイル名の変更を中止します。"
Read-HostDefault "OK?" > $null # 入力待ち
}else{
# フォルダ下の拡張子数
$myExtCount2 = (Get-ChildItem -Recurse -File | ForEach-Object{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique | ForEach-Object{$_ -replace "\.",""}|measure-object -Line).Lines
# 拡張子変数(フォルダ)の配列宣言
$myExt2 = New-Object "object[,]" $myExtCount2,4
[int]$myCNT4 = 0 # 拡張子カウンタ
# $myLine1 = (Get-Content -LiteralPath $ExtFile1|Measure-Object -Line).Lines
foreach($tmpExt2 in (Get-ChildItem -Recurse -File | ForEach-Object{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique | ForEach-Object{$_ -replace "\.",""})){
$myExt2[$myCNT4,0] = $tmpExt2 # 拡張子(変更前)
$myExt2[$myCNT4,1] = 0 # 0/1 = 拡張子変更(jpg)しない/する
$myExt2[$myCNT4,2] = $tmpExt2 # 拡張子(変更後)
$myExt2[$myCNT4,3] = 0 # 0/1 = 作業非対象/作業対象
# 拡張子ファイルに存在する拡張子のみ作業対象とする
for($i = 0; $i -lt $myLine1; $i++){
if($tmpExt2 -ceq $myExt1[@($i,0)]){
$myExt2[$myCNT4,1] = $myExt1[@($i,1)]
$myExt2[$myCNT4,2] = $myExt1[@($i,2)]
$myExt2[$myCNT4,3] = 1 # 1 = 作業対象
}
}
$myExt2_0 = $myExt2[@($myCNT4,0)]
$myExt2_1 = $myExt2[@($myCNT4,1)]
$myExt2_2 = $myExt2[@($myCNT4,2)]
$myExt2_3 = $myExt2[@($myCNT4,3)]
$myCNT4_1 = $myCNT4 + 1
Write-Host "`$myExt2("$myCNT4_1"/"$myExtCount2")="$myExt2_0","$myExt2_1","$myExt2_2","$myExt2_3
$myCNT4++
}
[int]$TotalCount1 = 0 # 総ファイル数(作業対象)
[int]$TotalCount2 = 0 # 総ファイル数(作業非対象)
[int]$TotalCount3 = 0 # 総ファイル数(作業対象+作業非対象)
$TotalCount3 = (Get-ChildItem -File *.* | Measure-Object).Count
$NonTargetFiles1 = Get-ChildItem -File *.* # 作業非対象ファイル
[int]$myCNT4 = 0 # 拡張子カウンタ
for($myCNT4 = 0; $myCNT4 -lt $myExtCount2; $myCNT4++){
[int]$myCNT2 = 0 # ファイル数のカウンタ
# 一度目のファイル名一括変換(一時的なファイル名への変換)
$tmpExt2 = $myExt2[@($myCNT4,0)]
$tmpExt2_1 = "." + $tmpExt2
# Write-Host "tmpExt2_1="$tmpExt2_1
$myExtCount1 += (Get-ChildItem -File *.$tmpExt2| Where-Object {$_.Extension -ceq $tmpExt2_1} | Measure-Object).Count # 拡張子ごとのファイル数を配列に追加
$myExt2_3 = $myExt2[@($myCNT4,3)]
if($myExt2_3 -eq 1){
Get-ChildItem -File *.$tmpExt2| Where-Object {$_.Extension -ceq $tmpExt2_1} | Sort-Object Name | ForEach-Object -Begin {$myCNT2 = $StartNo1} -Process { $Newname = $tmpName1+$myCNT2.tostring("000")+$_.extension; rename-item $_ $Newname; $myCNT2++ }
$StartNo1 = $myCNT2 # 次の拡張子の開始番号
$NonTargetFiles1 = $NonTargetFiles1 | Where-Object {$_.Extension -cne $tmpExt2_1}
$j=$myExtCount1[$myCNT4] # 拡張子ごとのファイル数を作業用変数に格納
$TotalCount1 += $j # 拡張子ごとのファイル数を総ファイル数に足す
$myCNT4_1 = $myCNT4 + 1
Get-ChildItem -File *.$tmpExt2 | Where-Object {$_.Extension -ceq $tmpExt2_1} | Write-Output | Write-Host
Write-Host $tmpExt2"("$myCNT4_1"/"$myExtCount2")のファイル数="$j
}
}
$TotalCount2 = $TotalCount3 - $TotalCount1
Write-Host ""
Write-Host "総ファイル数(作業対象)="$TotalCount1
Write-Host ""
Write-Output $NonTargetFiles1 | Write-Host
Write-Host "総ファイル数(作業非対象)="$TotalCount2
Write-Host ""
Write-Host "総ファイル数(作業対象+作業非対象)="$TotalCount3
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
Write-Host "一度目のファイル名一括変換後のファイル名"
Get-ChildItem # ファイル一覧
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
# if ([String]::IsNullOrEmpty($myINPUT1)){
# echo "INPUTはNull"
# }else{
# echo "INPUTはNullではない"
# }
# Read-HostDefault "OK?" > $null
# 二度目のファイル名一括変換
for($myCNT4 = 0; $myCNT4 -lt $myExtCount2; $myCNT4++){
$tmpExt2 = $myExt2[@($myCNT4,0)]
$tmpExt2_1 = "." + $tmpExt2
$myExt2_3 = $myExt2[@($myCNT4,3)]
if($myExt2_3 -eq 1){
Get-ChildItem -File *.$tmpExt2 | Where-Object {$_.Extension -ceq $tmpExt2_1} | Rename-Item -NewName { $_.Name -replace $tmpName1,$NewFileName2 }
}
}
# 拡張子(jpeg, jpe, jfif, jpg_large)をjpgに変更
for($myCNT4 = 0; $myCNT4 -lt $myExtCount2; $myCNT4++){
$tmpExt2 = $myExt2[@($myCNT4,0)]
$myExt2_1 = $myExt2[@($myCNT4,1)]
$myExt2_2 = $myExt2[@($myCNT4,2)]
$myExt2_3 = $myExt2[@($myCNT4,3)]
$j=$myExtCount1[$myCNT4]
if(($myExt2_1 -eq 1) -and ($myExt2_3 -eq 1) -and ($j -ge 1)){myFExtChnge1 $tmpExt2 $myExt2_2 $j $MyFlag1 $ChgExt1}
}
# if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
Write-Host "二度目のファイル名一括変換後のファイル名"
Get-ChildItem # ファイル一覧
# Zip圧縮
$myFilePath2 = Convert-Path ".." # 1つ上のフォルダの絶対パス
$NewFileName3 = $NewFileName1.Replace("_","") # 新しいファイル名から_を取る
$NewFileName3 = $NewFileName3 + ".zip" # 拡張子zipをつける
$myFilePath2 = $myFilePath2 + "\" + $NewFileName3
myFCompZip2 -InFolderName1 $MyFilePath1 -OutZipName1 $myFilePath2
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
}
}else{
Write-Host "新しいファイル名の確認でY以外が入力された"
Write-Host "ファイル名の変更をスキップします。"
Read-HostDefault "OK?" > $null # 入力待ち
}
}else{
if(($ErrFlg1 -eq $FALSE) -and ($myINPUT1 -eq "N")){
Write-Host "ファイル名を変更しますか(Y/N)? にY以外が入力された"
}
Write-Host "ファイル名を変更しません。"
Read-HostDefault "OK?" > $null # 入力待ち
}
# ファイルパス、他を履歴ファイルに出力
$tmpStr1 = $MyFilePath2 + "," + $MyFlag1 + "," + $NewFileName1 + "," + $StartNo
$tmpStr1 = $tmpStr1 + "," + $AddDate1 + "," + $AddYoubi1 + "," + $AddTime1
$tmpStr1 = $tmpStr1 + "," + $ChgExt1
# $myLine1 = (Get-Content -LiteralPath $HistFile1|Measure-Object -Line).Lines
Write-Host "myCNT1/myLine1="$myCNT1"/"$myLine2"の履歴を書き込みます。`r`n"
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-09-15
に以下の変更をしました。
1.置換対象ファイルはzip圧縮されているものを解凍して置換する
【参考にした情報】
・「PowerShellの関数を手続き的に書きたい(出力が戻り値に含まれてしまう問題)」
https://tyru.hatenablog.com/entry/2015/11/08/004204
【Extract1.ps1】
# 7-Zip 解凍
# 日本語を含むスクリプトを実行すると文字化けが発生する。
# 原因:VisualStudioCodeのUTF-8はBOM無し、PowerShellのUTF-8はBOMありのため
# 対策:スクリプトをUTF-8(BOMあり)で保存する
# パラメータ
Param(
[Parameter(Mandatory=$true)]
[String]$InZip1 # 解凍前のZipファイル
)
# 関数:文字コードを表示
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
# 定数
# 7-Zipのパス
$myPath1 = "C:\Program Files\7-Zip"
# スクリプト本体
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
# 7-Zipのフォルダに移動
Set-Location -Path $myPath1
$myResult1 = $true
# 解凍前zipファイルの存在確認
if (-not(Test-Path($InZip1))) {
Write-Host $InZip1"がありません。"
$myResult1 = $false
}
# Zipファイル内のフォルダ名
if ($myResult1 -eq $true) {
./7z l $InZip1 | Tee-Object -Variable Result7Zip # zipファイルの中身を確認
$myList1 = ($Result7Zip | select-string -pattern "D\.\.\.\.") # 解凍後に出力されるフォルダの行を抽出
$Str_array1 = @() # 配列初期化
$Str_array1 = $myList1 -split " +" # 空白で分割
$myArrayLast1 = $Str_array1.Count - 1 # 配列の最後
$myOutFolder1 = Split-Path $InZip1 # 解凍先フォルダ(解凍前のzipファイルの親フォルダ)
$myOutFolder2 = $myOutFolder1 + "\" + ($Str_array1[$myArrayLast1]) # 解凍で出力されるフォルダ
$myOption1 = "-o" + $myOutFolder1 # 7zipコマンドの出力フォルダ
Write-Host "myList1="$myList1
Write-Host "myArrayLast1="$myArrayLast1
Write-host "Str_array1["$myArrayLast1"]="($Str_array1[$myArrayLast1])
Write-Host "myOutFolder1="$myOutFolder1
Write-Host "myOutFolder2="$myOutFolder2
Write-host "myOption1="$myOption1
# 解凍後フォルダの存在確認
if (Test-Path($myOutFolder2)) {
Write-Host $myOutFolder2"が既にあります。"
$myResult1 = $false
}
}
Read-HostDefault "OK?" > $null # 入力待ち
if ($myResult1 -eq $true) {
# zipファイルを解凍
./7z x $myOption1 $InZip1 | Tee-Object -Variable Result7Zip
# 7-Zipの解凍は成功したか?
$myResult1 = ($Result7Zip | Select-String -Pattern 'Everything is Ok' -CaseSensitive -Quiet)
# 圧縮成功していたら、元zipファイルを削除
$myString1 = "を削除しました 。"
if($myResult1 -eq $true){
Remove-Item -Path $InZip1
$myString1 = $InZip1+$myString1
Write-Host $myString1
}
}
# 終了
# 実行前のフォルダに戻る
Set-Location $CurrentPath1
# ドットソース演算子の{}を抜ける
Return
}|Out-Null # ドットソース演算子の{}内の標準出力は戻り値に含めない
# 以下、戻り値
Return $myResult1, $myOutFolder2
【ChangeName3_UTF8.ps1】
## 定数 ##
# 文字コード変換DLL
$myDLL = "C:\abcde\PowerShell\ReadJEnc\dll\net47\Hnx8.ReadJEnc.dll"
# スクリプトがある場所
$ScriptPath1 = Split-Path $MyInvocation.MyCommand.Path -Parent
# 履歴ファイル
$HistFile1 = $ScriptPath1+"\FilePath1.txt"
# 拡張子ファイル
$ExtFile1 = $ScriptPath1+"\FileExtension1.txt"
# JPGファイル
# $JpgExt_array = @("jpeg", "jpe", "jfif", "jpg_large")
# 関数:文字コードを表示
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]
}
# 関数:終了処理
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
}
# 関数:文字コード判別
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
}
# 関数:区切り文字の次の文字から最終文字までを切り出す
Function myStrCut1($MyFilePath1,$MyLastIndex){
# 元の文字列の長さ
[int]$MyLength1 = $MyFilePath1.Length
# ファイルパスの切り出し開始文字
[int]$MyStart1 = $MyLastIndex + 1
Write-Host "MyStart1="$MyStart1
# 切り出す文字数
[int]$MyLength2 = $MyLength1 - $MyStart1
Write-Host "MyLength2="$MyLength2
# ファイルパスの区切り文字"_"の次の文字から最終文字までを切り出す
[string]$PathL3 = $MyFilePath1.Substring($MyStart1, $MyLength2)
# 切り出した文字数が10文字を超えたら、10文字に切り詰める
if($MyLength2 -gt 10){
[int]$MyStart1 = $MyLength2 - 10
[string]$PathL3 = $PathL3.Substring($MyStart1, 10)
}
# アンダーバーを連結
$PathL3 += "_"
# Write-Host "`$PathL3="$PathL3
return $PathL3
}
# 関数:英数字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 myFExtChnge1($myExt1,$myExt2,$myExtCount1,$MyFlag1,$ChgExt1){
# myExt1 : 変更前の拡張子
# myExt2 : 変更後の拡張子
# myExtCount1 : 拡張子ごとのファイル数
# MyFlag1 : 履歴1 : 対話/バッチ = 0/1
# ChgExt1 : 履歴7 : 0/1 = 拡張子を変更しない/変更する
switch($ChgExt1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myMessage1 = "拡張子("+$myExt1+")[ファイル数="+$myExtCount1+"]を拡張子("+$myExt2+")に変更しますか(Y/N)?"
$myINPUT1 = Read-HostDefault $myMessage1 $myINPUT1
}
if($myINPUT1 -eq "Y"){
$myExt1a = '\.'+$myExt1+'$'
$myExt2a = '.'+$myExt2
$myExt1b ='*.'+$myExt1
Get-ChildItem -File $myExt1b | Rename-Item -NewName { $_ -replace $myExt1a,$myExt2a }
$myMessage1 = "拡張子("+$myExt1+")[ファイル数="+$myExtCount1+"]を拡張子("+$myExt2+")に変更しました。"
Write-Host $myMessage1
}
}
# 関数:ファイルの存在確認
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
}
}
# Zip圧縮
function myFCompZip2 {
param (
[Parameter(Mandatory=$true)]
[String]$InFolderName1,
[String]$OutZipName1
)
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8' # なくても動くが日本語を含む出力が文字化けする
$WorkDirectory1 = "C:\Document\PowerShell\work"
Set-Location $WorkDirectory1
$commandPath = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
# $InFolderName1="C:\abcde\tmp\ああああ_YYx"
# $OutZipName1 = "C:\abcde\tmp\YYx.zip"
$ScriptFile1 = "C:\abcde\PowerShell\Compress1.ps1 -InFolder1 $InFolderName1 -OutZip1 $OutZipName1"
$Argument1 = "-Command $ScriptFile1"
$stdErrLogTmp = ".\stderr.log"
$stdOutLogTmp = ".\stdout.log"
$myResult1 = $true
# 圧縮前フォルダの存在確認
if (-not(Test-Path($InFolderName1))) {
Write-Host $InFolderName1"がありません。"
$myResult1 = $false
}
# 圧縮後ファイルの存在確認
if (Test-Path($OutZipName1)) {
Write-Host $OutZipName1"が既にあります。"
$myResult1 = $false
}
if ($myResult1 -eq $true) {
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;
}
}
}
Write-Host "`$myResult1=$myResult1"
}
# メイン部分
# DLLを読み込み
$myAnswer1 = myFFileExist1 -myFileText1 "文字コード変換DLL" -myFilePath1 ([ref]$myDLL)
if($myAnswer1 -eq $FALSE){exit} # DLLが存在しない場合は終了
[Reflection.Assembly]::LoadFile($myDLL) > $null
# 拡張子ファイルを読み込み
$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,3
# 拡張子ごとのファイル数の配列宣言
$myExtCount1 = @()
$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 = 拡張子変更(jpg)しない/する
$myExt1[$myCNT4,2] = $Str_array1[2] # 拡張子(変更後)
$myExt1_0 = $myExt1[@($myCNT4,0)]
$myExt1_1 = $myExt1[@($myCNT4,1)]
$myExt1_2 = $myExt1[@($myCNT4,2)]
$myCNT4_1 = $myCNT4 + 1
Write-Host "`$myExt1("$myCNT4_1"/"$myLine1")="$myExt1_0","$myExt1_1","$myExt1_2
$myCNT4++
}
# $myExtLine1 = $myExt1.Length # 拡張子変数の配列要素数
}
Read-HostDefault "OK?" > $null # 入力待ち
# 文字コードをUTF-8に変更
chcp 65001
# 文字コードを表示
myFShChrCd1
# 現在のパス
$CurrentPath1 = Get-Location
Write-Host "現在のパス="$CurrentPath1
Write-Host "スクリプトがある場所="$ScriptPath1
Read-HostDefault "OK?" > $null # 入力待ち
# 履歴変数の配列宣言
$PrevPath1 = @()
# エラーフラグをリセット
$ErrFlg1 =$FALSE
# 履歴ファイルの存在確認
$myAnswer1 = myFFileExist1 -myFileText1 "履歴ファイル" -myFilePath1 ([ref]$HistFile1)
if($myAnswer1 -eq $FALSE){exit} # 履歴ファイルが存在しない場合は終了
# 履歴ファイルの文字コード確認
$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[]]
}
# 履歴カウンタ
[int]$myCNT1 = 1
# 履歴の数だけ繰り返し
$Str_array1 = @() # 配列初期化
foreach ($MyPrev1 in $PrevPath1){
# 履歴をカンマで区切る
$Str_array1 = $MyPrev1 -Split ",";
# $MyFilePath1 = $Str_array1[0] # 履歴0 : ファイルがあるフォルダ
$myFilePath2 = $Str_array1[0] # 履歴0 : Zipファイルのパス
$MyFlag1 = $Str_array1[1] # 履歴1 : 対話/バッチ = 0/1
$NewFileName1 = $Str_array1[2] # 履歴2 : 新しいファイル名
[String]$StartNo = $Str_array1[3] # 履歴3 : ファイル名の連番の開始番号
$AddDate1 = $Str_array1[4] # 履歴4 : 0/1 = ファイル名に日付を追加しない/追加する
$AddYoubi1 = $Str_array1[5] # 履歴5 : 0/1 = ファイル名に曜日を追加しない/追加する
$AddTime1 = $Str_array1[6] # 履歴6 : 0/1 = ファイル名に時刻を追加しない/追加する
$ChgExt1 = $Str_array1[7] # 履歴7 : 0/1 = 拡張子を変更しない/変更する
Write-Host "履歴番号(myCNT1/myLine1)=($myCNT1/$myLine2)"
# Write-Host "MyFilePath1="$MyFilePath1
Write-Host "MyFilePath2="$MyFilePath2
Write-Host "MyFlag1="$MyFlag1
Write-Host "NewFileName1="$NewFileName1
Write-Host "StartNo="$StartNo
Write-Host "AddDate1="$AddDate1
Write-Host "AddYoubi1="$AddYoubi1
Write-Host "AddTime1="$AddTime1
Write-Host "ChgExt1="$ChgExt1
$tmpStr1 = $MyFilePath2.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)){
# $MyFilePath1 = Read-HostDefault "($myCNT1/$myLine2)ファイル名変更の対象ファイルがあるフォルダ?" $MyFilePath1
# }
# Zipファイルのパスを入力
if(($MyFlag1 -eq 0) -and ($ErrFlg1 -eq $FALSE)){
$MyFilePath2 = Read-HostDefault "($myCNT1/$myLine2)ファイル名変更の対象ファイルのZipファイル?" $MyFilePath2
}
if($ErrFlg1 -eq $FALSE){
if(-Not(Test-Path $MyFilePath2)){
# Zipファイルが存在しない
Write-Host "Zipファイル("$MyFilePath2")が存在しません。"
$ErrFlg1 = $TRUE
}else{
# # フォルダが存在する場合
# Zipファイルが存在する場合、解凍
Set-Location -LiteralPath $ScriptPath1
$myResult2 = .\Extract1.ps1 -InZip1 $MyFilePath2
if($myResult2[0] -eq $TRUE){
$MyFilePath1 = $myResult2[1]
# ファイルがあるフォルダへ移動
Set-Location -LiteralPath $MyFilePath1
# ファイル名の一覧を表示
Write-Host "変更前のファイル名です。"
Get-ChildItem
$myINPUT1 = "Y"
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "ファイル名を変更しますか(Y/N)?" "N"
}
}else{
$ErrFlg1 = $TRUE
}
}
}
if(($ErrFlg1 -eq $FALSE) -and ($myINPUT1 -eq "Y")){
# エラーフラグが偽、かつ、答えがYなら、以下実行
# ファイルパスの長さ
[int]$MyLength1 = $MyFilePath1.Length
Write-Host "MyLength1="$MyLength1
# ファイルパスの区切り文字"_"の位置
[int]$MyLastIndex1 = $MyFilePath1.LastIndexOf("_", $MyLength1 - 1)
Write-Host "`$MyLastIndex1="$MyLastIndex1
# ファイルパスの区切り文字"\"の位置
[int]$MyLastIndex2 = $MyFilePath1.LastIndexOf("`\", $MyLength1 - 1)
Write-Host "`$MyLastIndex2=$MyLastIndex2"
if(($MyLastIndex1 -eq -1) -And ($MyLastIndex2 -eq -1)){
# 区切り文字"_", "\"の両方が見つからない場合
# ファイルパスの切り出し開始文字を最終文字から2文字目にする
$MyLastIndex2 = $MyLength1 - 3 - 1
# ファイルパスの最終3文字を切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex2
}elseif(($MyLastIndex1 -ge 0) -And ($MyLastIndex2 -eq -1)){
# 区切り文字"_"だけ見つかった場合
# ファイルパスの最終"_"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex1
}elseif(($MyLastIndex1 -eq -1) -And ($MyLastIndex2 -ge 0)){
# 区切り文字"\"だけ見つかった場合
# ファイルパスの最終"\"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath11 $MyLastIndex2
}elseif(($MyLastIndex1 -ge 0) -And ($MyLastIndex2 -ge 0)){
# 区切り文字"_", "\"の両方が見つかった場合
if($MyLastIndex1 -gt $MyLastIndex2){
# 区切り文字"_"が"\"より後ろにある場合
# ファイルパスの最終"_"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex1
}else{
# 区切り文字"\"が"_"より後ろにある場合
# ファイルパスの最終"\"から後ろを切り出す
[string]$PathL3 = myStrCut1 $MyFilePath1 $MyLastIndex2
}
}
Write-Host "`$PathL3="$PathL3
# 新しいファイル名候補の\を_に変換
$PathL3 = $PathL3.replace("`\","_")
# 新しいファイル名を入力
if($MyFlag1 -eq 0){
[String]$NewFileName1 = Read-HostDefault "新しいファイル名?" $PathL3
}
# 日付をファイル名に追加
[String]$myDate1 = Get-Date -Format "yyyyMMdd"
switch($AddDate1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "日付($myDate1)をファイル名に追加しますか(Y/N)?" $myINPUT1
}
switch($myINPUT1){
Y{$AddDate1=1;$NewFileName2=$NewFileName1+$myDate1;$NewFileName2+="_"}
N{$AddDate1=0;$NewFileName2=$NewFileName1}
Default{$AddDate1=0;$NewFileName2=$NewFileName1}
}
# 曜日をファイル名に追加
[String]$myYoubi = (Get-Date).DayOfWeek
$myYoubi = $myYoubi.Substring(0,3)
switch($AddYoubi1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "曜日($myYoubi)をファイル名に追加しますか(Y/N)?" $myINPUT1
}
switch($myINPUT1){
Y{$AddYoubi1=1;$NewFileName2+=$myYoubi;$NewFileName2+="_"}
N{$AddYoubi1=0}
Default{$AddYoubi1=0}
}
# 時刻をファイル名に追加
# タイムゾーンを表示
$MyTimeZone = Get-CimInstance -Class Win32_TimeZone -Namespace "Root\CIMV2"
[int]$MyJisa = $MyTimeZone.Bias / 60
if($MyJisa -gt 0){[string]$myFugou1 = "+"}
elseif($MyJisa -eq 0){[string]$myFugou1 = ""}
elseif($MyJisa -lt 0){[string]$myFugou1 = "-"}
else{[string]$myFugou1 = "?"}
Write-Host "UTCとの時差="$myFugou1$MyJisa"時間"
Write-Host "タイムゾーン:"$MyTimeZone.Caption
[String]$myTime1 = Get-Date -Format "HHmmss"
switch($AddTime1){
0{$myINPUT1 = "N"}
1{$myINPUT1 = "Y"}
Default{$myINPUT1 = "N"}
}
if($MyFlag1 -eq 0){
$myINPUT1 = Read-HostDefault "時刻($myTime1)をファイル名に追加しますか(Y/N)?" $myINPUT1
}
switch($myINPUT1){
Y{$AddTime1=1;$NewFileName2+=$myTime1;$NewFileName2+="_"}
N{$AddTime1=0}
Default{$AddTime1=0}
}
# ファイル名の連番の開始番号を入力
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){
Write-Host "開始番号="$StartNo" に整数以外が入力されたのでスキップします。"
$ErrFlg1 = $TRUE
}
if($ErrFlg1 -eq $FALSE){
# 新しいファイル名の確認
$myINPUT1 = "Y"
if($MyFlag1 -eq 0){
[String]$String1 = "新しいファイル名:" + $NewFileName2 + $StartNo1.tostring("000") + ".jpg でよろしいですか(Y/N)?"
$myINPUT1 = Read-HostDefault $String1 "N"
}
}
if(($ErrFlg1 -eq $FALSE) -and ($myINPUT1 -eq "Y")){
# xxxxxxxxx_001.xxx, xxxxxxxxx_002.xxx と昇順で名前を付け替える
# 一時的な名前($tmpName1)を発生
$tmpName1 = myRndStr1(10) # 10文字
$tmpName1 += "_"
write-host "一時的なファイル名(`$tmpName1)=$tmpName1"
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
# 1回目の変換後にファイル名の重複が発生する場合は中止
# 検索パタン
$myPattern = "^" + $tmpName1 + "[0-9]{3}"
# 重複ファイル数
$myMatchCount = (Get-ChildItem|Where-Object {$_.Name -match $myPattern}|Measure-Object).Count
#Write-Host "`$myMatchCount=$myMatchCount"
if($myMatchCount -ge 1){
Write-Host "ファイル名の重複が発生するため、ファイル名の変更を中止します。"
Read-HostDefault "OK?" > $null # 入力待ち
}else{
# フォルダ下の拡張子数
$myExtCount2 = (Get-ChildItem -Recurse -File | ForEach-Object{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique | ForEach-Object{$_ -replace "\.",""}|measure-object -Line).Lines
# 拡張子変数(フォルダ)の配列宣言
$myExt2 = New-Object "object[,]" $myExtCount2,4
[int]$myCNT4 = 0 # 拡張子カウンタ
# $myLine1 = (Get-Content -LiteralPath $ExtFile1|Measure-Object -Line).Lines
foreach($tmpExt2 in (Get-ChildItem -Recurse -File | ForEach-Object{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique | ForEach-Object{$_ -replace "\.",""})){
$myExt2[$myCNT4,0] = $tmpExt2 # 拡張子(変更前)
$myExt2[$myCNT4,1] = 0 # 0/1 = 拡張子変更(jpg)しない/する
$myExt2[$myCNT4,2] = $tmpExt2 # 拡張子(変更後)
$myExt2[$myCNT4,3] = 0 # 0/1 = 作業非対象/作業対象
# 拡張子ファイルに存在する拡張子のみ作業対象とする
for($i = 0; $i -lt $myLine1; $i++){
if($tmpExt2 -ceq $myExt1[@($i,0)]){
$myExt2[$myCNT4,1] = $myExt1[@($i,1)]
$myExt2[$myCNT4,2] = $myExt1[@($i,2)]
$myExt2[$myCNT4,3] = 1 # 1 = 作業対象
}
}
$myExt2_0 = $myExt2[@($myCNT4,0)]
$myExt2_1 = $myExt2[@($myCNT4,1)]
$myExt2_2 = $myExt2[@($myCNT4,2)]
$myExt2_3 = $myExt2[@($myCNT4,3)]
$myCNT4_1 = $myCNT4 + 1
Write-Host "`$myExt2("$myCNT4_1"/"$myExtCount2")="$myExt2_0","$myExt2_1","$myExt2_2","$myExt2_3
$myCNT4++
}
[int]$TotalCount1 = 0 # 総ファイル数(作業対象)
[int]$TotalCount2 = 0 # 総ファイル数(作業非対象)
[int]$TotalCount3 = 0 # 総ファイル数(作業対象+作業非対象)
$TotalCount3 = (Get-ChildItem -File *.* | Measure-Object).Count
$NonTargetFiles1 = Get-ChildItem -File *.* # 作業非対象ファイル
[int]$myCNT4 = 0 # 拡張子カウンタ
for($myCNT4 = 0; $myCNT4 -lt $myExtCount2; $myCNT4++){
[int]$myCNT2 = 0 # ファイル数のカウンタ
# 一度目のファイル名一括変換(一時的なファイル名への変換)
$tmpExt2 = $myExt2[@($myCNT4,0)]
$tmpExt2_1 = "." + $tmpExt2
# Write-Host "tmpExt2_1="$tmpExt2_1
$myExtCount1 += (Get-ChildItem -File *.$tmpExt2| Where-Object {$_.Extension -ceq $tmpExt2_1} | Measure-Object).Count # 拡張子ごとのファイル数を配列に追加
$myExt2_3 = $myExt2[@($myCNT4,3)]
if($myExt2_3 -eq 1){
Get-ChildItem -File *.$tmpExt2| Where-Object {$_.Extension -ceq $tmpExt2_1} | Sort-Object Name | ForEach-Object -Begin {$myCNT2 = $StartNo1} -Process { $Newname = $tmpName1+$myCNT2.tostring("000")+$_.extension; rename-item $_ $Newname; $myCNT2++ }
$StartNo1 = $myCNT2 # 次の拡張子の開始番号
$NonTargetFiles1 = $NonTargetFiles1 | Where-Object {$_.Extension -cne $tmpExt2_1}
$j=$myExtCount1[$myCNT4] # 拡張子ごとのファイル数を作業用変数に格納
$TotalCount1 += $j # 拡張子ごとのファイル数を総ファイル数に足す
$myCNT4_1 = $myCNT4 + 1
Get-ChildItem -File *.$tmpExt2 | Where-Object {$_.Extension -ceq $tmpExt2_1} | Write-Output | Write-Host
Write-Host $tmpExt2"("$myCNT4_1"/"$myExtCount2")のファイル数="$j
}
}
$TotalCount2 = $TotalCount3 - $TotalCount1
Write-Host ""
Write-Host "総ファイル数(作業対象)="$TotalCount1
Write-Host ""
Write-Output $NonTargetFiles1 | Write-Host
Write-Host "総ファイル数(作業非対象)="$TotalCount2
Write-Host ""
Write-Host "総ファイル数(作業対象+作業非対象)="$TotalCount3
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
Write-Host "一度目のファイル名一括変換後のファイル名"
Get-ChildItem # ファイル一覧
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
# if ([String]::IsNullOrEmpty($myINPUT1)){
# echo "INPUTはNull"
# }else{
# echo "INPUTはNullではない"
# }
# Read-HostDefault "OK?" > $null
# 二度目のファイル名一括変換
for($myCNT4 = 0; $myCNT4 -lt $myExtCount2; $myCNT4++){
$tmpExt2 = $myExt2[@($myCNT4,0)]
$tmpExt2_1 = "." + $tmpExt2
$myExt2_3 = $myExt2[@($myCNT4,3)]
if($myExt2_3 -eq 1){
Get-ChildItem -File *.$tmpExt2 | Where-Object {$_.Extension -ceq $tmpExt2_1} | Rename-Item -NewName { $_.Name -replace $tmpName1,$NewFileName2 }
}
}
# 拡張子(jpeg, jpe, jfif, jpg_large)をjpgに変更
for($myCNT4 = 0; $myCNT4 -lt $myExtCount2; $myCNT4++){
$tmpExt2 = $myExt2[@($myCNT4,0)]
$myExt2_1 = $myExt2[@($myCNT4,1)]
$myExt2_2 = $myExt2[@($myCNT4,2)]
$myExt2_3 = $myExt2[@($myCNT4,3)]
$j=$myExtCount1[$myCNT4]
if(($myExt2_1 -eq 1) -and ($myExt2_3 -eq 1) -and ($j -ge 1)){myFExtChnge1 $tmpExt2 $myExt2_2 $j $MyFlag1 $ChgExt1}
}
# if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
Write-Host "二度目のファイル名一括変換後のファイル名"
Get-ChildItem # ファイル一覧
# Zip圧縮
$myFilePath2 = Convert-Path ".." # 1つ上のフォルダの絶対パス
$NewFileName3 = $NewFileName1.Replace("_","") # 新しいファイル名から_を取る
$NewFileName3 = $NewFileName3 + ".zip" # 拡張子zipをつける
$myFilePath2 = $myFilePath2 + "\" + $NewFileName3
myFCompZip2 -InFolderName1 $MyFilePath1 -OutZipName1 $myFilePath2
if($MyFlag1 -eq 0){Read-HostDefault "OK?" > $null} # 入力待ち
}
}else{
Write-Host "新しいファイル名の確認でY以外が入力された"
Write-Host "ファイル名の変更をスキップします。"
Read-HostDefault "OK?" > $null # 入力待ち
}
}else{
if(($ErrFlg1 -eq $FALSE) -and ($myINPUT1 -eq "N")){
Write-Host "ファイル名を変更しますか(Y/N)? にY以外が入力された"
}
Write-Host "ファイル名を変更しません。"
Read-HostDefault "OK?" > $null # 入力待ち
}
# ファイルパス、他を履歴ファイルに出力
$tmpStr1 = $MyFilePath2 + "," + $MyFlag1 + "," + $NewFileName1 + "," + $StartNo
$tmpStr1 = $tmpStr1 + "," + $AddDate1 + "," + $AddYoubi1 + "," + $AddTime1
$tmpStr1 = $tmpStr1 + "," + $ChgExt1
# $myLine1 = (Get-Content -LiteralPath $HistFile1|Measure-Object -Line).Lines
Write-Host "myCNT1/myLine1="$myCNT1"/"$myLine2"の履歴を書き込みます。`r`n"
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-10-05 10:11
ヤバイぜ!(9)
コメント(1)
ヤバイぜ! ありがとうございます(^_0)ノ
by cheese999 (2021-10-05 10:25)