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"


参考

        ログ出力関数が記載されている。

                -ErrorAction Stop $ErrorActionPreferenceなどエラー制御が記載されている。

        try catchのことが記載されている。


コメント

このブログの人気の投稿

ソリューション構成ごとにconfigファイルを作成する

C++の古いプロジェクトのビルドでerror MIDL2311 : statements outside library block are illegal in mktyplib compatability mode

web.config debug/releaseの内容を変換構文を使って切り替える