タイトルのまんまです。備忘録。
コマンドで置換するとファイル更新日が更新されるのでそれでは困る人用。
mpword.ps1 を実行すると
↓置換ワードリスト選択(GUI)
↓処理対象フォルダ選択(GUI)
処理終了
#全ソース
mpword.ps1
# 置換対象リストを基に、作成日・更新日をそのままにしつつ複数ファイル一括置換
# mpword.ps1 -> メイン実行ファイル。セキュリティポリシで実行出来ない場合、
# "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned mpword.ps1" 等として呼び出す
# search_word.csv -> 置換ワードリスト、正規表現使えます。 "検索文字列","置換文字列" 実行時にこのファイル場所を指定する(ヘッダあり)
# 初期化
Add-Type -Assembly System.Windows.Forms
[string]$dir_path = ""
[string]$file_creationtime = ""
[string]$file_lastwritetime = ""
[string]$searchfile_path = ""
[object]$select = ""
[array]$csv_array = @()
[object]$itemlist = ""
# 置換対象リスト選択
$select = New-Object System.Windows.Forms.OpenFileDialog
$select.Filter = 'CSVファイル(*.csv)|*.csv|全てのファイル(*.*)|*.*'
$select.Title = "置換ワードリストを選択してください"
$select.ShowHelp = $false
if(!$select.ShowDialog() -eq "OK"){ exit }
$searchfile_path = $select.FileName
# CSV読み込み
$csv_array = Import-Csv $searchfile_path -Encoding UTF8
# フォルダ名選択・取得
$shApp = New-Object -com Shell.Application
$dir_path = $shApp.BrowseForFolder(0, "処理対象フォルダを選択してください", 0, ($env:HOMEPATH)).Self.Path
if($dir_path -eq ""){ exit }
$itemlist = Get-ChildItem $dir_path
foreach($item in $itemlist)
{
# フォルダを除外する
if(!$item.PSIsContainer)
{
# 作成日・更新日取得
$file_creationtime = (Get-ItemProperty ($dir_path + "\" + $item.Name)).CreationTime
$file_lastwritetime = (Get-ItemProperty ($dir_path + "\" + $item.Name)).LastWriteTime
# 置換
for($i=0; $i -lt $csv_array.length; $i++)
{
$data = (Get-Content ($dir_path + "\" + $item.Name)) -replace $csv_array[$i]."検索文字列",$csv_array[$i]."置換文字列"
$data | Out-File ($dir_path + "\" + $item.Name)
}
# 作成日・更新日設定
Set-ItemProperty ($dir_path + "\" + $item.Name) -name CreationTime -value $file_creationtime
Set-ItemProperty ($dir_path + "\" + $item.Name) -name LastWriteTime -value $file_lastwritetime
Write-Host($item.Name + " -> 置換完了")
}
}
Read-Host "処理完了"
replace_word.csv
"検索文字列","置換文字列"
"\d{4}/\d{2}/\d{2},\d{2}:\d{2}:\d{2},.*,",""
※↑使用例。ファイル名は起動時指定するのでなんでも良いけどヘッダ名は指定してます。UTF-8推奨
PowerShell便利なんだけど -v みたいな詳細表示オプション欲しい