PowerShellのワンライナーを実行するWindowsタスクをPowerShellで登録

題名の通り、WindowsタスクにPowerShellのワンライナーを埋め込みたくて方法を調べていました。ついでに、IISのログを削除するWindowsタスクを、PowerShellワンライナーで実装して、PowerShellでWindowsタスク登録するまでやったのでメモ。(何書いてるかわからなくなってきましたが)

実際の実装例として、指定の日数より古いIISのログを削除するWindowsタスクを登録するPowerShellを書いてみました。

Windowsはタスク一つ登録するのにも大変ですね・・その分色々できますが。PowerShell使えば手順的にもシンプルになって良いです。

$iisLogDir = "C:\inetpub\logs\LogFiles\W3SVC1"
$logRetentionDays = 30
$filter = "*.log"

$taskName = "HouseKeep IIS Logs"
$taskPath = "\IIS Tasks"

$powershellExe = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$command = '-Command "Invoke-Command {'
$command += "Get-ChildItem -Path '$iisLogDir' -Filter '$filter'" 
$command += " | ?{!`$_.PSIsContainer}" 
$command += " | ?{((Get-Date) - `$_.CreationTime).Days -gt $logRetentionDays}"
$command += " | %{Remove-Item `$_.FullName}"
$command += '}"'

$principal =  New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount 
$action = New-ScheduledTaskAction -Execute $powershellExe -Argument $command
$trigger = New-ScheduledTaskTrigger -Daily -At 1am
$task = New-ScheduledTask -Trigger $trigger -Principal $principal -Action $action 

Register-ScheduledTask -InputObject $task -TaskName $taskName -TaskPath $taskPath 

後は実行テストしてみます。たぶん問題無く動くはず。

f:id:yomon8:20190919204130p:plain