はじめに
Power PlatformでSolutionをエクスポートすると、ZIPファイルとして出力されます。
Solutionの中身をソースとして確認するには、Solution ZIPに加えて CanvasApps 配下の .msapp も展開する必要があります。
さらに、展開後にはランダムIDやGUIDがファイル名に含まれるため、毎回手作業で展開・整理するのは少し手間です。
そこで今回は、Solution ZIPを渡すだけで、展開からファイル名の整理まで自動で行うバッチファイルを作成しました。
また、バッチファイルへの追加要望が発生した際には生成AIを使って修正し、WinMergeで変更前後を比較して、要件以外の変更が入っていないか確認しました。
※本記事に登場するSolution名・アプリ名・フロー名などは、すべてサンプル用の名称に置き換えています。
目次
今回やったこと
今回作成したバッチファイルでは、Solution ZIPを渡すと以下の処理を自動で行います。
- Solution ZIPを展開
- Solutionフォルダ名からバージョン番号を削除
-
CanvasApps配下の.msappを一括展開 -
.msapp展開後のフォルダ名からランダムIDを削除 - 展開済みの
.msappを削除 -
Workflows配下のJSONファイル名からGUIDを削除 - 既存の展開先フォルダがある場合は削除して再作成
例えば、
SampleSolution_1_0_0_0.zip
を渡すと、
SampleSolution
というフォルダへ展開・整理します。
使い方
Solution ZIPを ExtractSolution.bat にドラッグ&ドロップするだけです。
コマンドラインから実行する場合は、ZIPファイルを引数として指定します。
ExtractSolution.bat "SampleSolution_1_0_0_0.zip"
実行すると、Solution ZIPの展開から .msapp の展開、ファイル名の整理までまとめて処理されます。
============================================
Power Platform Solution展開処理
============================================
【1】Solution ZIPを展開します。
【2】msappファイルを展開します。
対象:sample_app_7cb18_DocumentUri.msapp
展開先:sample_app_DocumentUri
【3】Workflowsファイル名からランダムIDを削除します。
============================================
すべての処理が完了しました。
============================================
バッチファイルの主な処理
.msapp を展開する
Canvas Appを含むSolutionでは、CanvasApps 配下に .msapp ファイルがあります。
今回はWindowsの tar コマンドを使って展開しました。
tar -xf "%%~fF" -C "!APP_OUTPUT_DIR!"
これにより、Solution内に複数のCanvas Appがある場合でもまとめて展開できます。
ランダムIDを削除する
.msapp のファイル名には、ランダムな文字列が含まれることがあります。
sample_app_7cb18_DocumentUri.msapp
展開後は不要なID部分を削除し、
sample_app_DocumentUri
のようにフォルダ名を整えます。
ファイル名を一定にすることで、展開後のソースを扱いやすくなります。
WorkflowのGUIDを削除する
Workflows 配下のJSONファイルには、末尾にGUIDが付与される場合があります。
SampleFlow-D7A0DF5B-E54C-F111-BEC7-000D3A34223C.json
これを、
SampleFlow.json
のような名前に変更します。
GUIDの削除にはPowerShellの正規表現を使用しました。
powershell.exe -NoProfile -Command ^
"$name = $env:ORIGINAL_WF_NAME; [Console]::Write($name -replace '-[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$','')" ^
> "%TEMP%\renamed_wf_json_!WF_COUNT!.txt"
ファイル操作はバッチ、正規表現による文字列処理はPowerShellという形で役割を分けています。
Solutionのバージョン番号を削除する
エクスポートしたSolutionには、以下のようにバージョン番号が付いています。
SampleSolution_1_0_0_0.zip
今回はバージョン番号以降を削除し、
SampleSolution
というフォルダ名で展開します。
powershell.exe -NoProfile -Command ^
"$name = $env:OUTPUT_NAME; [Console]::Write($name -replace '_[0-9]+_[0-9]+_[0-9]+_[0-9]+.*$','')" ^
> "%TEMP%\renamed_output_dir.txt"
.*$ を含めているため、
SampleSolution_0_0_0_4-after-cleanup.zip
のようにバージョン番号の後ろに文字列がある場合にも対応できます。
既存フォルダは削除してから展開する
展開先フォルダがすでに存在する場合は、一度削除してから再作成します。
前回のファイルが残ったまま新しいファイルと混ざることを防ぎ、毎回同じ状態から展開できるようにしています。
生成AIで追加要望に対応
バッチファイルを作成した後、追加要望への対応が必要になったため、生成AIを利用して ExtractSolution.bat を修正しました。
既存のバッチファイルと追加要望を生成AIに渡し、要件に沿って修正を依頼しています。
ただし、生成AIによる修正では、指示した箇所以外にも変更が入っていないか確認する必要があります。
そこで、修正前後のバッチファイルをWinMergeで比較しました。
WinMergeで変更内容を確認
WinMergeで以下の2ファイルを比較します。
修正前のExtractSolution.bat
↓
WinMergeで比較
↓
修正後のExtractSolution.bat
確認したポイントはシンプルに以下の2点です。
- 追加要望が正しく反映されているか
- 要件以外の変更が入っていないか
今回は、
追加要望
↓
生成AIでバッチを修正
↓
WinMergeで差分確認
↓
バッチを実行して動作確認
という流れで確認しました。
生成AIを使ってコードを修正する場合でも、AIの回答だけで判断せず、実際の差分を確認することが重要だと感じました。
まとめ
今回は、Power Platform Solutionの展開・整理を自動化するバッチファイルを作成しました。
これまで手作業で行っていた、
Solution ZIPの展開 → .msapp の展開 → ファイル名の整理
をまとめて実行できるようになりました。
また、追加要望への対応では生成AIを使ってバッチファイルを修正し、WinMergeで変更前後を比較しました。
生成AIを利用することで修正作業を効率化できますが、要件どおりの変更になっているか、要件以外の変更が入っていないかを確認する工程も重要です。
今後はGitでのバージョン管理などとも組み合わせて、変更内容をより管理しやすい形にしていきたいと思います。


