指定したフォルダ内にあるファイルリストを作りたい、という相談を受けた
引数で渡す処理にしてもよかったんだが、簡単に使えるようにするには、ドラック&ドロップ処理でリストが取れるようにした方がいいだろうな、ということで実装した。
また、作成したファイルリストは保存先とファイル名を容易に指定できるようにダイアログを出すようにした。参考にしたのは プログラム★ノートの「PowerShell ファイル保存ダイアログを使用する方法」
保存先は基本的にマイドキュメント以下として、ファイル名はドロップしたフォルダ名を使うようにした。
また、作成したPowerShellファイル(ps1)ファイルに直接ドロップしてもうまくいかないので、ショートカットを作成して、リンク先を修正して使用するようにしている。
なお、今回は使用している内容の都合上、Windows OS上でのみ動作することになってるはず。
# ドラッグされたフォルダの中にあるファイル一覧をつくるやつ
#
# 使い方
# 1. このファイルを保存する
# 2. このファイルのショートカットを作成する
# 3. ショートカットのプロパティを開き"リンク先"の項目の先頭に「powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File 」をつけて保存
# 4. 作成されたショートカットの上に、フォルダをドロップすると、ウィンドウが開いて確認される
# 5. 作成するファイルリストの保存ファイル名を指定する
# 6. 出力される
#
$Args | foreach{
echo $_.GetType()
$searchdir = Get-Item -LiteralPath $_
}
Write-Host $searchdir.FullName "のファイル一覧を作成します"
pause
# https://pg-note.com/archives/1144 より
# 必要なアセンブリを読み込む
Add-Type -AssemblyName System.Windows.Forms
$dialog = New-Object Windows.Forms.SaveFileDialog
$dialog.Title = "ファイルの保存"
$dialog.Filter = "テキストファイル(*.txt)|*.txt|csvファイル(*.csv)|*.csv|全てのファイル|*.*"
$dialog.InitialDirectory = [Environment]::GetFolderPath("MyDocuments")
$dialog.FileName = $searchdir.Name
$ret = $dialog.ShowDialog()
if ($ret -eq "OK"){
Write-Host ("保存するファイル名、" + $dialog.FileName)
# ディレクトリの検索 start
Get-ChildItem -Recurse $searchdir | ForEach-Object {
$filename=$_.FullName
if( !$_.PSIsContainer ){
Write-Host $filename
$filename|Out-File -FilePath $dialog.FileName -Append
}
}
# ディレクトリの検索 end
} else {
Write-Host ("キャンセル")
}
pause