PowerShellでスクリプトを作る(第一回)

・前提

コマンドプロンプトに頼り、PowerShellを実務で少ししか触ったことがなかった(PowerShellを使ってHyper-Vの仮想スイッチを作ってタグVLANの検証を行ったくらい)ので以下の講座でハンズオンしてみる

速攻で効く・私のPowerShell講座 | Udemy

実際にPowerShellを作成する前に…

PowerShellの拡張子がps1であること、編集する際は右クリックから編集を選択してWindows Powershell ISEという標準エディタを使用して編集するのがポピュラー

上記のように表示される

デフォではPowerShellのスクリプトは実行できないので以下の手順で設定変更する

  • PowerShellを管理者権限で実行
  • Set-ExecutionPolicy RemoteSignedを入力
  • Get-ExecutionPolicyと入力してRemoteSignedが表示されればOK

デモンストレーションとして日付操作のスクリプトを作成する(コマンドプロンプトのdateコマンドと近いか)

Get-Date -Format "yyyy/MM/dd HH:mm:ss"

続けてファイルのコピーを行うためにファルダを以下の構成にする

copy.ps1に以下を記入(cpコマンドと同じか)

Copy-Item "コピー元ファイル格納パス" "コピー先ファイル格納パス"

確かに内容が転記されている

ファイルの移動について、以下で実行(mvコマンドと同じか)

Move-Item "コピー元ファイル格納パス" "コピー先ファイル格納パス"

ファイルの削除について、以下で実行(rm,delコマンドと同じか)

Remove-Item "削除対象ファイル格納パス"

ファイルに文字を記入(echoコマンドと同じか)

$file="文字を記入するファイルパス"
"入力内容" | Out-File $file #この行の末尾に-Appendを記入すれば再度実行すると同じ内容が更に追記される

・基本文法

以下for文について

for ($i=0; $i -lt 10; $i++)
{
    出力内容
}
$list = "a", "b", "c"
foreach ($x in $list)
{
	Write-Output x
}
$files = Get-ChildItem "フォルダパス"
foreach ($f in $files)
{
	Write-Output ("フルパス:" + $f.FullName)
	Write-Output ("ファイル名:" + $f.Name)
}

以下if文について例(また、条件の中で等号は-eq,以上は-ge,以下は-le,文字列が含まれているときは-like)

$score = 10

if ($score -eq 10)
{
	Write-Output "スコアは10点です"
}
else
{
	Write-Output "スコアは10点ではありません"	

以下では関数の構文について(引数のない関数呼び出しは関数名を記述するだけでよい)

function 関数名($変数名1,$変数名2…)
{
    関数の処理内容
}

#呼び出すときは関数名 変数名1 変数名2となり()は不要

以下エラー発生時そのエラー内容を吐き出させるコマンド

try
 {
正常に実行したい処理内容
 }
 catch
 {
エラー時の処理内容
}

以下PowerShellでSQLコマンドを使用するためにモジュールをインストールする方法を記述

管理者モードで以下を記述

Install-Module -Name SqlServer #だめならInstall-Module -Name SqlServer–AllowClobber
#それでもだめなら[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

※SQLクエリの実行について資料確認

※Invoke-Sqlcmdは4000文字を超えると切り落とされてしまうので注意

以下、PowerShellでExcelを操作するモジュールをインストールするコマンド

Install-Module -Name ImportExcel

SQLサーバを操作してcsvで出力する一例

$ret = Invoke-Sqlcmd @params | ConvertTo-CSV -NoTypeInformation
$ret | Out-File out.csv -force

SQLサーバを操作してExcelで出力する一例

$ret = Invoke-Sqlcmd @params
$ret | Export-Excel "out.xlsx" -ExcludeProperty "RowError", "RowState", "Table", "ItemArray", "HasErrors"

外部アプリを呼び出す構文

$exe = "呼び出すファイルのパス"
Start-Process -FilePath $exe -Wait #-Waitはそのアプリが終了されるまでコードが該当行で処理を待機することを表す

別のps1ファイルを読み込む構文(ここではtest.ps1ファイルの変数$test1を呼び出す処理を記載)

$scriptPath = $MyInvocation.MyCommand.Path
$scriptPath = Split-Path -Parent $scriptPath

. (Join-Path $scriptPath "test.ps1")

Write-Output $test1

デバッグの方法として、ISEの検証したい行で右クリックしてブレークポイントを選択して期待した結果になっているかを確認

デバッグモードの終了はexitと入力

今までタスクスケジューラでGUI操作で定時実行を命令していたが、[操作]の[プログラム/スクリプト]にpowershellを選択すればその内容が実行できることを学んだので、定時実行にPowerShellを活用することが出来るようになった

※引数の指定に以下を入力してバックグラウンド処理する

-WindowStyle Hidden -File “呼び出しファイル名”

また、開始の欄には呼び出す.ps1ファイルの格納されているパスを記入

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です