はじめに

前回は仕事を効率化するためにPowerShellを使うメリットを紹介しました。今回は使用準備手順と使用例を紹介します。

  

準備環境

まずはPowerShellが搭載されているPCを用意します。

Windows 8.1や10 のPCであれば、PowerShellが標準で搭載されています。

また、以下のWindowsサーバーでも標準で搭載されています。

・Windows Server 2012、2012 R2、2016、2019

今回はWindows10 OSのPCをサンプルとして紹介します。

  

実行ポリシーの設定

PCのスタートメニューからWindows PowerShellを探します。

Windows PowerShellはコマンドプロンプトのようなコンソール、Windows PowerShell ISEはPowerShell専用の総合開発環境です。

Windows PowerShellを起動し、下記のコマンドレットを入力し、現在設定されている実行ポリシーを確認します。

Get-ExecutionPolicy

ポリシーには以下のような種類があります。※詳細はマイクロソフトのサイトで確認できます。

種類実行できるスクリプト
Restrictedスクリプトの実行不可
AllSigned署名付スクリプトであれば実行可能
RemoteSigned署名付スクリプト、または自分で作成しローカルに保存したスクリプトは実行可能
Unrestrictedすべてのスクリプトが実行可能。ただしインターネットからダウンロードされた未署名のスクリプトは実行時に実行するかどうか確認されるのでユーザーが明示的に許可した場合のみ実行される
Bypass何もブロックされず、警告もメッセージも表示せずに実行する

PCの初期設定値はRestrictedで、サーバーの場合、初期設定値はRemoteSignedです。

PCの初期設定では、RestrictedのためPowerShellのスクリプトを実施しようとしてもエラーになります。実行に際してはポリシーを変更する必要がありますが、実行ポリシーを変更する際は自社の規程等に照らして問題ないことを確認してください。

自分で作成したスクリプトを実行可能させるために、ポリシーをRemoteSignedに設定します。

Set-ExecutionPolicy RemoteSigned

これで準備作業が完了しました。

  

スクリプトの実行

PowerShellのスクリプトの拡張子は.ps1です。テキストエディタでソースコードを作成し、.ps1の拡張子として保存しても実行可能ですが、今回はWindows PowerShell ISEを使います。

試しに、特定のフォルダに”テスト.txt”ファイルを作成し、中に“Hello World!”と書くps1ファイルを作成します。

①Windows PowerShell ISEを起動します。

②下記のソースコードを入力し、【XXX】部分を自分のPCのユーザー名を書き換え、”ファイル作成.ps1″として保存します。

Set-Location C:\Users\【XXX】\Documents\
New-Item テスト.txt -itemType File -Value "Hello World!"

③保存した”ファイル作成.ps1″を右クリックしてPowerShellで実行をクリックすると、C:\Users\【XXX】\Documentフォルダ内にテスト.txtが作成されます。中身を見ると、Hello World!と書かれていることが確認できます。

  

日常業務での使用例

日常業務に役立つサンプルをいくつか紹介します。

●テンプレートファイルを使って、複数ファイルを作成したい場合

社員毎のアンケート用ファイル等、同じ内容のファイルをコピーしてファイル名だけが異なるファイルを大量に作らないといけない作業、日常業務で多く発生する方もいるかと思います。10名程度なら手作業でもよいですが、数が30、50等になると、手作業だとかなり大変です。でもPowerShellなら簡単に実現できるため、効率的です。また、一度作れば今後もずっと使用できます。

社員毎にファイルを作りたい場合、まず対象者のリストをファイルで用意してください。対象者の名前が縦にリスト状に列挙されていれば、ファイル形式はテキストでもCSVでも大丈夫です。

下記のソースコードの【】部分を自身のPC環境に書き換えて、.ps1ファイルとして保存、実行します。

$list = "【対象者リストのパス】"
$templatefile = "【テンプレートファイルのパス】"
$save = "【保存先フォルダのパス】"
$target = Get-Content $list
Foreach ($name in $target)
{
    $to = $save + $name + "【テンプレートファイルの拡張子。.xlsx等】"
    Copy-Item $templatefile $to
}

●毎日Outlookで同じ様なメールを送信したい場合

PowerShellはフォルダやテキストファイルなどではなく、ExcelやOutlookも操作できます。例えば日報のように、特定の人へ同じ形式のメールを送信する業務は少なくないと思います。PowerShellスクリプトで宛先設定、件名や本文記載など、送付直前状態まで自動化できれば、手作業による宛先間違いもなく、日常業務を効率化できます。また、もし本文修正が不要の場合は送信まで自動化することも可能です。さらに、スクリプトをWindowsのタスクスケジューラーに登録することで、平日の18:00など特定の時間に実行され、送付忘れも防止することができます。

下記のソースコードの【】部分を自身のPC環境に書き換えて、.ps1ファイルとして保存、実行します。

$to = "【宛先メールアドレス】"
$cc = "【CCメールアドレス】"
$title =  "【件名】"
$content = "【本文】" 
$outlook = New-Object -comObject Outlook.Application
$mail = $outlook.CreateItem(0)
$mail.Subject = $title
$mail.Body = $content
$mail.To= $to
$mail.CC = $cc
$mail.save()
$inspector = $mail.GetInspector
$inspector.Display()

●巨大なCSVファイルを複数ファイルに分割したい場合

システムから一括出力したCSVファイルが巨大で開けない、あるいはPC動作が極端に遅くなってしまう場合もあるかと思います。ファイルを一定行数毎に分割して別ファイルとして保存できれば、PC動作も速くなり、待ち時間なく作業することができます。

下記のソースコードを.ps1ファイルとして保存、実行すれば、簡単に実現できます。

Function Testpath([string]$Path,[string]$type){
  If(!(Test-Path $Path -PathType $type))
  {
    Write-Host "指定するパスが存在しません。確定してぐださい。"
    return $false
  }
  Else
  {
     return $true
  }
}

Function TestLines($lines){
  [int]$line = 0
  If(!([int]::TryParse($Lines,[ref]$line)))
  {
    Write-Host "0より大きな整数を入力してください。"
    return $false
  }
  Else
  {
    If($Line -gt 0)
    {
      return $true
    }
    Else
    {
      Write-Host "0より大きな整数を入力してください。"
      return $false
    }
  }
}

#####ユーザー入力&入力値チェック#####
Do
{
  [string]$TargetPath = Read-Host "`r`nStep①|分割したいcsvファイルのパスを入力してください。`r`nパス"
}
While(!(Testpath $TargetPath "leaf"))

Do
{
  [string]$SavePath = Read-Host "`r`nStep②|保存フォルダのパスを入力してください。`r`nパス"
}
While(!(Testpath $SavePath "container"))

Do{
  [string]$Lines = Read-Host "`r`nStep③|分割したい行数を入力してください。`r`n行数"
}
While(!(TestLines $Lines))

#####Main処理#####
Try{
  $data = Get-Content $TargetPath -Encoding Default
  $Len = $data.Length
  $Line =[int]$Lines
  For($i=1; $i -lt $Len/$Line+1; $i++){
    $x = ($i-1)*$Line
    $y = $i*$Line-1
    If ($y -gt $Len){$y = $Len}
    $Path = $SavePath + "\tmp_" + $i +".csv"
    $data[$x..$y]|Out-File -FilePath $Path -Encoding default
  }
}catch{
  Write-Host "処理にエラ-が発生しました。処理が終了いたしました。"
  Write-Host $_
}

Write-Host "`r`n処理が正常終了しました。"
Write-Host "この画面は3秒後に終了します。"
sleep 3
exit

  

今回はPowerShellの準備と、日常業務で使えるサンプルを紹介しました。

次回は、もう少し複雑な日常業務の自動化をPowershellで実現する例を紹介します。