BATファイル:ローカルフォルダ内にある各ファイル名の特定部分を抽出し、その文字列をフォルダ名として各該当ファイルを振り分けてAzureのストレージにアップロードしたい

実現したいこと

Report_001_123415_xxxx01_xxxx02.pdf
UpdateReport_002_2345_xxxx01_xxxx02.pdf
SpecialReport_003_789642_xxxx01_xxxx02.pdf

上記のような規則性のあるファイルが格納されているフォルダがあり、
そのフォルダを指定することで一挙にAzureのストレージにアップロードするようなbatを
見よう見まねで調べながら作成しました。
一括でAzureの指定したストレージにアップロードされるところまでは実現できたのですが、その先が進めません。
ここから実現したいと思っているのは、以下です。
①ファイル名の規則性にのっとって、特定の文字列を抽出
(具体的には、ファイル名内の2個目のアンダーバー以降、かつ3つ目のアンダーバーまでの数字(文字数可変)を抽出したい)
②その抽出した文字列をフォルダ名とし、各該当するファイルを割り振って、Azureのストレージにアップロードする

発生している問題・分からないこと

一括アップロードするファイルについては、規則性はあるものの各箇所の文字数などが可変となっています。
EXCEL関数のFINDのように指定した文字(今回であればアンダーバー)が、文字列の何番目にあたるか分かる処理があれば、それを引数にして特定文字列を抽出することが可能なのではないかと考えたのですが、その方法が見つからず…。
(EXCELでは、ファイル名から特定の文字列を抽出する関数を書くことは出来ているのですが…やはり一度EXCELを介して、加工するなどの他ないのでしょうか?)
何か他にファイル名の一部分を抽出する良い方法があれば、アドバイス頂けますと大変助かります。
大変申し訳ありませんが、当方初心者中の初心者のため、何か不足している情報などありましたらご教示頂けますと幸いです。
よろしくお願いいたします。

該当のソースコード

AzLogin.ps1

1az login

FileUpload.ps1

1$defaultaccountname = 'defaultaccountname' 2$accountname = Read-Host "ストレージアカウント名[デフォルト値:$($defaultaccountname)]" 3$accountname = ($defaultaccountname,$accountname)[[bool]$accountname] 4 5$defaultcontainername = '$web' 6$containername = Read-Host "コンテナ名[デフォルト値:$($defaultcontainername)]" 7$containername = ($defaultcontainername,$containername)[[bool]$containername] 8 9$defaultdestinationpath = '/images/' 10$destinationpath = Read-Host "アップロード先のパス[デフォルト値:$($defaultdestinationpath)]" 11$destinationpath = ($defaultdestinationpath,$destinationpath)[[bool]$destinationpath] 12 13$sourcepath = Read-Host "アップロード元のフォルダーパス" 14 15$date = (Get-Date -F G).Replace('/','').Replace(' ','_').Replace(':',''); 16$destbefore = $date + "_before_upload_list.txt" 17$destafter = $date + "_after_upload_list.txt" 18 19az storage blob list --account-name $accountname --container-name $containername --output table --prefix $destinationpath > $destbefore 20if (!$?) { 21 Write-Error "ログの取得に失敗しました。パラメータを確認してください。" 22 exit 2 23} 24 25az storage blob upload-batch --account-name $accountname -d $containername --destination-path $destinationpath -s $sourcepath 26if (!$?) { 27 Write-Error "ファイルのアップロードに失敗しました。パラメータを確認してください。" 28 exit 2 29} 30 31az storage blob list --account-name $accountname --container-name $containername --output table --prefix $destinationpath > $destafter 32if (!$?) { 33 Write-Error "ログの取得に失敗しました。パラメータを確認してください。" 34 exit 2 35}else{ 36 exit 0 37}

Upload.bat

12@echo off 3 4echo %time% 5set time2=%time: =0% 6 7set hh=%time2:~0,2% 8set mn=%time2:~3,2% 9set ss=%time2:~6,2% 10 11:: ID生成 12set id=%date:/=%-%hh%%mn%%ss% 13 14SET BAT_LOG=%~dp0\%id%_スクリプト実行結果.txt 15 16echo "Azureへのログイン情報を入力してください" 17PowerShell -File %~dp0\login.ps1 >> %BAT_LOG% 18@IF %ERRORLEVEL% NEQ 0 ( 19echo "Azureアカウントへのログインに失敗しました。入力値を確認してください。" 20echo %ERRORLEVEL% 21pause 22exit 23) 24echo "Azureアカウントへのログインに成功しました。" 25echo %ERRORLEVEL% 26 27echo "アップロードのための情報を入力してください" 28PowerShell -File %~dp0\FileUpload.ps1 >> %BAT_LOG% 29@IF %ERRORLEVEL% NEQ 0 ( 30echo "アップロードに失敗しました。入力値を確認してください。" 31echo %ERRORLEVEL% 32pause 33exit 34) 35echo "アップロードに成功しました。" 36echo %ERRORLEVEL% 37pause

試したこと・調べたこと

上記の詳細・結果

teratrailでバッチについて検索してみましたが、
『”前から何文字目から、何文字目まで”などの規則性が無ければ難しい』
という指摘を目にして、やはり難しいのだろうかと感じてます…。

EXCELで作った関数を、ファイル名出力の際に一緒にcsvとして出力
(例えばA1に抽出用関数を出力、B1にファイル名出力)出来たなら、
更にそれをbatで取り込んでA1セルフォルダ名として指定、
B1セルと合致するファイル名のものをアップロード…など色々考えましたが、
まず"A1に抽出用関数を出力、B1にファイル名出力"ということ自体がうまくいかず、
こちらに質問させて頂いております…。

補足

現在は、ストレージアカウント名やコンテナ名をコマンドプロンプトから指定できるようになっていますが、
文字列が抽出できるようになったら、引数で渡して先に進むよう変更しようと思っています。

コメントを投稿

0 コメント