powershell

PowerShell スクリプトファイルにして実行する

スクリプトを書く

PowerShellスクリプトは拡張子.ps1のファイルに記載します。記載したファイルをフルパスまたは相対パス指定で実行できます。この時スクリプトファイルの文字コードの選択は以下表を参考にしてください。ASCII文字だけしか扱わないならそれほど気にする事もありませんが日本語を扱う場合どうしても文字化け問題に遭遇するとおもいますが、まずは以下の組み合わせでスクリプトファイルを書くことが文字化け対策の第一歩になります。

No. 実行環境 スクリプトファイルの文字コード
1 V5.1に限定する場合 Shift-JISもしくはutf-8 BOM付
2 V5.1~V7.xの何れでも動作させたい utf-8 BOM付
3 V6以降に限定 utf-8 BOM付でもよいがutf-8 BOM無しを推奨します

スクリプトファイル(拡張子.ps1)を直接指定し動作させる場合

以下は「システム日付から求めるログファイル」が存在しない場合新規作成し、存在した場合「存在した」とメッセージをログファイルへ追記していく簡単なスクリプトです。

sample01.ps1 という名前でスクリプトを記載します
$logfolder="./logs"
$logfile=Join-Path $logfolder ((Get-Date -Format "yyyyMMdd_HHmm") + ".log")
Write-Host $logfile
if  ( ! (Test-Path $logfile ) ) {
    Write-Host "存在しないので新規作成"
    $lofilemeta=New-Item $logfile -Force
    Write-Host $lofilemeta.LastWriteTime
} else {
    Write-Output  "存在した"  | out-file $logfile -Append
}
実行例
# 以下はスクリプトファイルを作成した状態です。
# カレントフォルダにはスクリプトファイルのみ存在しています。
#
PS D:\work\temp> ls

    ディレクトリ: D:\work\temp

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/12/04     14:49            369 sample01.ps1


# スクリプトファイルを相対パス指定で実行
# 「sample01.ps1」だけ指定してもエラーになり実行できません
#
PS D:\work\temp> .\sample01.ps1
.\logs\20221204_1502.log
存在しないので新規作成
2022/12/04 15:02:22

# 再度実行
PS D:\work\temp> .\sample01.ps1
.\logs\20221204_1502.log

# 3回目実行
PS D:\work\temp> .\sample01.ps1
.\logs\20221204_1502.log
# lsで確認するとカレントフォルダにlogsフォルダが確認できます。
#
PS D:\work\temp> ls

    ディレクトリ: D:\work\temp

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2022/12/04     15:02                logs
-a----        2022/12/04     14:49            369 sample01.ps1


# logsフォルダの中を確認するとログファイルが確認できます。
#
PS D:\work\temp> ls logs

    ディレクトリ: D:\work\temp\logs

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/12/04     15:02             26 20221204_1502.log


# ログファイルの中を確認すると想定通り2件の「存在した」が記載されています
# 
PS D:\work\temp> cat .\logs\20221204_1502.log
存在した
存在した
PS D:\work\temp>

function動作させる場合

関数名を付けて保存します

上記スクリプトに以下赤字部分を追記して保存します。(ファイル名は同じです) 今回は「Write-logfile」という名前の関数名にしていますがここは自由です。

function Write-logfile
{
    $logfolder="./logs"
    $logfile=Join-Path $logfolder ((Get-Date -Format "yyyyMMdd_HHmm") + ".log")
    Write-Host $logfile
    if  ( ! (Test-Path $logfile ) ) {
        Write-Host "存在しないので新規作成"
        $lofilemeta=New-Item $logfile -Force
        Write-Host $lofilemeta.LastWriteTime
    } else {
        Write-Output  "存在した"  | out-file $logfile -Append
    }
}
実行例

関数名を付けると、スクリプトファイルの直接指定では起動しなくなります。マウスで誤ってクリックして意図せず動作させてしまうような事がこれでなくなります。その代わり、実行するには「ドットソース」が必要になります。具体的な方法は以下の通りです。

# function(関数)化した事で、スクリプトファイルの直接指定では起動しなくなります。
#
PS D:\work\temp> .\sample01.ps1
PS D:\work\temp>

# 関数形式呼び出しの前準備としてドットソース形式でメモリにファンクションを読み込みます。
#  「.」ドット  + 空白 + スクリプトファイルパス を「ドットソースする」といいますが
# これはスクリプトファイルをメモリに読み込むイメージです。
# 
PS D:\work\temp> . .\sample01.ps1

# 関数名を指定する事で実行できます
# パス指定は不要である点ポイントです。
#
PS D:\work\temp> Write-logfile
.\logs\20221204_1756.log
存在しないので新規作成
2022/12/04 17:56:21
PS D:\work\temp> Write-logfile
.\logs\20221204_1756.log
PS D:\work\temp>

# この状態で logsフォルダへ移動しても同様に実行できます
# メモリにファンクションが読み込まれている状態なので何処に移動しても
# パス指定する事なく実行可能です。そのかわり当然ですが、スクリプトファイルの書き換えが
# あった場合は、再度ドットソースしないとその内容は反映されません。
#
PS D:\work\temp> cd logs

PS D:\work\temp\logs> Write-logfile
.\logs\20221204_1736.log
存在しないので新規作成
2022/12/04 17:36:54
PS D:\work\temp\logs> 


以上となります。

PowerShellバージョンの確認方法

スポンサーリンク