はじめに
エクスプローラーでのファイルの並びと、
ロボットで取得できるファイルの順番が違うこと、その解決にスーパー苦戦したので記録に残します。
この記事はUiPathブログ発信チャレンジ2022サマーの29日目の記事です。
結論
アクティビティ「PowerShellの呼び出し」を使って取得結果を自然順に並べ替えます。
こんなことがしたい
フォルダに格納されているテキストファイルの一覧を取得します。
UiPathでの実装_ファイル名一覧を取得
さいしょにこんなんを作りました。
getfilesして、そのあとフルパスからファイル名だけにしています。
- 代入アクティビティの中身
String.Join("ファイル名:",Directory.GetFiles(folderpath,"*.txt").Select(Function(filepathary) New FileInfo(filepathary).Name))
- 実行結果
実行すると、こんな結果が返ってきます。
"message": "file.txtファイル名:file1.txtファイル名:file11.txtファイル名:file2.txtファイル名:file3.txt",
わかりやすく順番をつけると、
- file
- file1
- file11
- file2
- file3
となってしまっています。
これをエクスプローラーと同じ並びにしたいので…
UiPathでの実装_ファイル名一覧を自然順で取得
こんな感じに実装を変えました。
- PowerShell を呼び出しの中身
"Get-ChildItem " + folderpath+" | Sort-Object { [regex]::Replace($_.BaseName,"+Chr(34)+"\d+"+Chr(34) + ", { $args[0].Value.PadLeft(20) }) }"
シングルコーテーションをChr(34)にしているのは、見返したときに混乱するのを防ぐためです。
-
プロパティの設定
- スクリプトの入力→チェックを入れる
- TypeAugument→System.IO.FileInfo
-
実行結果
これも実行すると、こんな結果が返ってきます。
"file.txtファイル名:file1.txtファイル名:file2.txtファイル名:file3.txtファイル名:file11.txt"
これもわかりやすく順番をつけると、
- file
- file1
- file2
- file3
- file11
と、今回は想定通りにファイル名の一覧を取得することができました。
備考
PowerShellのコマンドが想定通りに動かない場合、
実際にPowerShellにコマンドを投げて、動きを確認してからアクティビティ内に落とし込むとハマる時間が少ないかと思います(それはそう)
参考文献
日付見てみたら10年以上前の投稿なんですね…
こういうのに助けられると、自分の記事もいつか誰かを助けられたらいいなと思います。
おわりに
今回はPowerShell使った実装を行いました。
LINQだけでも実現できそうな気がしてきたので、実装できたらまた記事書きます。
ここまでお読みいただきありがとうございました。