Windows PowerShell csvファイル文字列置換
csvファイルの一覧が記載されたファイルがある。
このcsvファイルの中身を次々に置換していくスクリプトを作成する。
# デバッグ表示
$DebugPreference = "Continue"
# $DebugPreference = "SilentlyContinue"
# ##### ログファイル設定
# ログファイル名取得
$SCRIPT_NAME = $myInvocation.MyCommand.name;
$SCRIPT_NAME_WITHOUT_EXT = [System.IO.Path]::GetFileNameWithoutExtension($SCRIPT_NAME);
Write-Debug "MyInvocation.MyCommand.Name: $SCRIPT_NAME_WITHOUT_EXT"
# ログディレクトリ設定
$LogPath = ".\Log" # ログの出力先
# ログフォルダーがなかったら作成
if( -not (Test-Path $LogPath) ) {
New-Item $LogPath -Type Directory
}
# ログファイル名設定(XXXX_YYYY-MM-DD.log)
$Now = Get-Date
$LogFile = $SCRIPT_NAME_WITHOUT_EXT + "_" +$Now.ToString("yyyy-MM-dd") + ".log"
$LogFileName = Join-Path $LogPath $LogFile
# ##### ログ出力関数
function Write_Log
{
param(
$LogString
)
$Now = Get-Date
# Log 出力文字列に時刻を付加(YYYY/MM/DD HH:MM:SS.MMM $LogString)
$Log = $Now.ToString("yyyy/MM/dd HH:mm:ss.fff") + " "
$Log += $LogString
# ログ出力
Write-Output $Log | Out-File -FilePath $LogFileName -Encoding Default -append
Write-Output $Log
# echo させるために出力したログを戻す
Return $Write_Log
}
# ##### 文字列置換関数
function Replace_Contents
{
param(
$targetFilePath,
$targetDir,
$srcWord,
$distWord
)
try{
$CSV_FILES=Import-Csv $targetFilePath -Encoding UTF8 -Delimiter `t -Header filename
}catch{
$ErrorMsg="Can not find the file path CSVTARGET_FILE_PATHFile => ${targetFilePath}: $PSItem"
$error[0].Exception.Message
Write-Output $ErrorMsg
Write_Log $ErrorMsg
Write_Log $error[0]
Write_Log $error[1]
Write_Log "!!!!Stop processing in the middle!!!!"
}
#$ErrorActionPreference = "Continue" # Errorが出ても続行せよ。
# CSVファイル読み出&文字列置換
Import-Csv $targetFilePath -Encoding UTF8 -Delimiter `t -Header filename | ForEach-Object {
# 変換するCSVファイル抽出
$CHANGE_FILE=Join-Path $targetDir ($_.filename + ".csv")
Write-Debug "CHANGE_FILE: $CHANGE_FILE"
try{
$UpdateContents=Get-Content $CHANGE_FILE
# Write-Debug "UpdateContents[0]: $UpdateContents[0]"
}catch{
Write-Debug "Can not the file : $CHANGE_FILE !!!"
throw
}
# Nullファイルならば次のファイルへ
if($null -eq $UpdateContents){
Write_Log "The File is NULL: $CHANGE_FILE"
return
}
# ファイルに検索ワード(srcWord)が含まれているか?
if((Get-Content -Path $CHANGE_FILE | Measure-Object -Line).Lines -le 1){
$IsContains=$UpdateContents.contains($srcWord)
Write-Debug "LessThanOrEqual 1: $IsContains"
}else{
$IsContains=$UpdateContents[0].contains($srcWord)
Write-Debug "Grater Than 1: $IsContains"
}
# 検索ワードがある場合は、置換実行
if($IsContains -eq $true){
Write-Debug "Start Replacement"
# 文字列置換
$data = $(Get-Content $CHANGE_FILE) -replace $srcWord, $distWord
# ファイル上書き
$data | Out-File $CHANGE_FILE
Write_Log ($CHANGE_FILE + " Completed!!")
}else{
Write_Log "Not Contain the word in $_.filename"
}
}
return $Replace_Contents
}
# ##### メインルーチン
# 変換文字列
$SRC_WORD="xxxxxxxxxxx"
$DST_WORD="yyyyyyyyyy"
# ## 開始1
# CSVファイルリストパス
$TARGET_DIR="01\02"
$TARGET_FILE="Insert.txt"
$TARGET_FILE_PATH=Join-Path $TARGET_DIR $TARGET_FILE
Write-Debug "TARGET_FILE_PATH: $TARGET_FILE_PATH"
Write-Output "END"
参考
- 【Powershell】ファイル内の文字列を置換して上書きする方法
- PowerShell で csv を扱う方法まとめ
- Windows PowerShell 入門(10)-デバッグ編
- PowerShell スクリプトの実行ログを出力する
ログ出力関数が記載されている。
-ErrorAction Stop $ErrorActionPreferenceなどエラー制御が記載されている。try catchのことが記載されている。
コメント
コメントを投稿