Powershell / slack / vivado > Generate Block Design終了時slack通知 (v0.3) > 終了時に1回通知されるようになった

```txt:動作確認
Windows 8.1 pro (64bit)
Vivado 2015.4
```

Generate Block Design終了時にslackへ通知する実装。

v0.1 > http://qiita.com/7of9/items/8ed747115ee472387674
v0.2 > http://qiita.com/7of9/items/de97823be273b254dc4b

v0.2では5回通知されていた。調べたところ、最後にvcsフォルダが更新されるので、vcsフォルダのファイルをチェックするようにしたところ、うまく通知されるようになった。

vcsフォルダの中身は一度削除されるので、Test-Pathでファイル削除エラーを回避している。

### code (v0.3)

```main.ps1
#
## 前提 > 以下のファイルがそろった環境で実行する
# 1. secret_slack_url.txt - slackのURL (git ignore対象ファイル)
# 2. target_dir.txt - Vivadoのhw/, SDK/ を含むフォルダ
# 3. このスクリプトファイル

<#
v0.3 2016 Jan 16
    - check [vcs\ps7_init.tcl]
v0.2 2016 Jan 16
    - check [mem_init_files\ps7_init.tcl] instead of [system.hwdef]
    - add find_ps7InitTcl()
v0.1 2016 Jan 15
    - add notifyToSlack()
    - add get_lastWriteTime_hwdef()
    - add find_hwdef()
    - add get_target_dir()
    - add get_slack_url()
    - add main()
#>


function get_slack_url() 
{
    $slkurl = ( Get-Content .\\secret_slack_url.txt )
    return $slkurl
}

function get_target_dir()
{
    $trgDir = ( Get-Content .\\target_dir.txt )
    return $trgDir
}

function find_hwdef($targetDir)
{
    $hwdf = ( Get-ChildItem $targetDir -Recurse "system.hwdef" )
    return $hwdf.Fullname
}

function find_ps7InitTcl($targetDir)
{
    # vcs folder is processed lastly among 5 folders (ies / modelsim / questa / vcs / xsim)
    #
    $tcllst = ( Get-ChildItem $targetDir -Recurse "ps7_init.tcl" )
    foreach($tclfile in $tcllst) {
#        echo $tclfile.Fullname
        if ( ($tclfile.Fullname).IndexOf("vcs") -gt 0) {
            return $tclfile.Fullname
        }
    }
    return ""
}

function get_lastDateTime($afile)
{
    if ( $afile.Length -eq 0 ) {
        return (Get-Date)
    }
    return (Get-ChildItem $afile).LastWriteTime
}

function notifyToSlack($msgToSlk, $slkurl) {
  $enc = [System.Text.Encoding]::GetEncoding('ISO-8859-1')
  $utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($msgToSlk)

  $notificationPayload = @{ 
    channel = "#zybo";
    username = "7of9";
    text = $enc.GetString($utf8Bytes);
  }

  Invoke-RestMethod -Uri $slkurl -Method Post -Body (ConvertTo-Json $notificationPayload)
}

function main() 
{
    $slackUrl = get_slack_url
    $targetDir = get_target_dir

    $ps7initTcl = find_ps7InitTcl $targetDir
    $pretime = get_lastDateTime($ps7initTcl)
    echo $pretime

    $msg = "Start"
    notifyToSlack $msg $slackUrl

    while ( 1 ) { 
        if (Test-Path $ps7initTcl) { # to avoid error by deletion of files during the process
            $curtime = (Get-ChildItem $ps7initTcl).LastWriteTime
            echo $curtime
            if ( $curtime -gt $pretime) {
                echo "Generate Block Design"
                notifyToSlack "Generated Block Design" $slackUrl
                $pretime = $curtime            
            }
        }

        sleep 5
    }

}

main
```

### 設定ファイル

以下のファイルを用意しておく。

1. secret_slack_url.txt - slackのincoming webhookのURL (<font color=red>git ignore対象ファイル</font>)
2. target_dir.txt - Vivadoのhw/, SDK/ を含む作業フォルダ

```secret_slack_url.txt
https://hooks.slack.com/services/xxxxx/xxxxx/xxxx
```

上記URLは本来のIncoming Webhookのアドレスから改変している(security対策)

```target_dir.txt
C:\ZyboDev\zybo_160112_baseDesign
```

### 結果

最後の2セットが2回試した結果。希望した通りの通知となった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dc798c66-2a66-ad0e-cfa4-ba219245e7a6.png)


### 備考

PowerShellはアクティブになっていないと処理がされないのかもしれない。この点はUnityのアプリと一緒で、バックグラウンドで動かす方法を見つけないとチェック処理をしているつもりでも、通知がされなくなる。

Vivadoで処理を動かした後に、PowerShellのウィンドウをアクティブにするか、そのウィンドウでEnterを入力するなりして使用している。5秒ごとにファイル更新日時が表示されていないと処理が止まっている。