Windows

【Powershellで業務自動化①】テキストの間違いを自動チェックしよう

会社の資料や社外へのメールなど、社内ルールで「NGワード」が定められているときありますよね。
今回はそんな「NGワード」をPowershellで自動検索してくれるスクリプトを作成したので紹介します。

ほんとはPythonやBashが使えたら一番楽なのですが、残念ながら業務用のPCにはPythonはインストールできません。
そこで今回はPowershellを使用しました。

Powershellなら、Windowsに標準でインストールされている上に、非常に強力にシェルプログラミングを行うことができます。
多くの日本企業の環境でも十分自動化できるパワーがありそうなのでこれからいろいろ学んでいきたいと思います。

もくじ

  1. ソースコード
  2. Powershell実行の注意点
  3. Powershellで標準入力を受け取る
  4. リストの中身を取り出す
  5. ワイルドカードで正規表現
  6. まとめ

ソースコード

さきにコード全文を貼っておきます。
このコードをそのままコピペして拡張子ps1のファイルとして保存すれば、シェルスクリプトとして使うことができます。

例えばtest.ps1という名前で保存したら、検索したいテキストファイルを引数にして、以下のコマンドで実行することができます。

$> ./test.ps1 テキストファイル.txt

ちなみに、検出したいNGワードは、下のコードの

$ngwords = @("この中身",)

を書き換えれば指定することができます。
ぜひ、自由にカスタムしてください。

Param([string]$filename)
$file = (Get-Content $filename) -as [string[]]
$i = 1
# NGワード
$ngwords = @("ちじむ", "まじか", "とうりに", "おうよそ", "むづかしい", "少しづつ", "思われ", "おそらく", "行う")
foreach ($line in $file) {
    $check = 0
    #NGワードチェック、一つでも一致したら色付きで返す
    foreach ($ngword in $ngwords) {
        if ($line -like "*${ngword}*") {
            $check = 1
            break
        }
        else {
            $check = 0
        }
    }
    # 条件に一致した文を色付きで返す
    if ($check -eq 1) {
        Write-Host $i : $line -ForegroundColor Black -BackgroundColor Yellow
    }
    else {
        Write-Host $i : $line
    }
    $i++
}

「NGワード」と一致する単語の入った文があれば、画像のように黄色に塗りつぶされて表示されます。

Powershell実行の注意点

次の2つのパターンの場合こちらのPowershellを実行することができないので注意してください。

1.セキュリティポリシーによってPowershellの実行がブロックされている場合
  実行するとこんなエラーがでます。

  セキュリティ対策ポリシーでPowershellスクリプトの実行が制限されてる場合にこのエラーがでます。

.\test.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\dev\test.ps1 を読み込むことができません。
詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
    

 解決法:
管理者権限でPowershellを開いて以下のコマンドを実行すれば解決します。

  $> Set-ExecutionPolicy RemoteSigned
  

これで解決。

2.ファイルエンコーディングがUTF-8 with BOMになっておらず、日本語を扱えない場合
  実行すると普通に文字化けします。

  VSCodeで作成すると、エンコーディングが勝手に設定されることが原因みたいです。

解決法:
VSCodeで、Ctrl+Shift+Pを押してコマンドウィンドウを開きます。
そこで、Change file encording > Save with encordingと進んで、UTF-8 with BOMを指定しましょう。

これで実行したときに日本語が正しく表示されるはずです。

Powershellで標準入力を受け取る

さて、ここからは簡単にコードの解説をしていきます。

以下のコードは、標準入力でファイル名を受け取り、そのファイルのテキストを変数に格納しています。

Param([string]$filename)
$file = (Get-Content $filename) -as [string[]]

Param([string]$filename)で引数を指定しています。

ちなみに、こんな感じに複数の引数を受け取ったり、整数型を指定することもできます。

Param([string]$name, [Int]$age)

使い道かなり広がりますね。
ちょっとしたコンソールアプリケーションなら、わざわざC#を使わなくても書けそうです。

リストの中身を取り出す

次は、リストの中身を一つずつ抜き出す方法です。
foreach文を使います。

PythonやC#でいうところのforの使い方とほとんど同じ見たいですね。

以下の文は、$ngwordsというリストから要素を一つずつ取り出して、$ngwordという変数に格納しています。
シンプルにリストの要素文ループを実行してくれるので、かなり使いどころは多い構文です。

$ngwords = @("ちじむ", "まじか", "とうりに", "おうよそ")
foreach ($ngword in $ngwords) {
    $ngwords
}

ワイルドカードで正規表現

Powershellの文字列はワイルドカードも使えるみたいです。

以下の文は、文字列の中にtestを含むかどうかで処理を分岐させています。
ワイルドカードである*で両側を挟んでいることによって、完全一致でなくてもtestという文字列を含んでいればTrueが返ってくるわけです。

if (文字列 -like "*test*") {
    $check = "True"
    $check
}
else {
    $check = "False"
    $check
}

実行するとこんな感じになります。

実行例:
 これはtestです
 > True

  これはgameです
  > False

まとめ

とりあえず自分の業務の効率化のために作ったスクリプトですが、NGワードチェッカーはかなり色々な場面に応用が利くかなと思ってます。

Powershellは、アプリケーションを入れられなかったり、ネットにつながってなかったりする業務PCでも使用できるのでおすすめです。
みなさんも、ガンガン業務を自動化して定時で帰りましょう!

今後もPowershell使って自分の業務効率化したり、自作のRPA作ったりして自動化できる仕事を増やしていこうと思います。
また記事にするのでぜひ読んでください。

また、何か効率化や自動化をしたい作業に関して要望が相談があればぜひお問い合わせください。
Twitterかコメントでお待ちしております。

COMMENT

メールアドレスが公開されることはありません。