・前提
コマンドプロンプトに頼り、PowerShellを実務で少ししか触ったことがなかった(PowerShellを使ってHyper-Vの仮想スイッチを作ってタグVLANの検証を行ったくらい)ので以下の講座でハンズオンしてみる
実際に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ファイルの格納されているパスを記入