2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShell Script 作成日・更新日をそのままにしつつ複数ファイル一括置換

Posted at

タイトルのまんまです。備忘録。
コマンドで置換するとファイル更新日が更新されるのでそれでは困る人用。

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 みたいな詳細表示オプション欲しい

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?