function ServiceRestart
{
Param
(
$ErrorLog,
$Services,
$MaxSize
)
$Time = Get-Date -Format 'yyyy:MM:dd HH:mm:ss'
$Result = (Get-Item $ErrorLog).length
if($Result -gt $MaxSize)
{
Clear-Content $ErrorLog
}
Try
{
Foreach($Service in $Services)
{
Restart-Service -DisplayName $Service -ErrorAction Stop
}
} Catch
{
"ERROR: $Service could not be restarted $Time" | Add-Content $ErrorLog
}
}
ServiceRestart -ErrorLog -Services -MaxSize
タスクスケジューラから次のパラメータを渡す必要があります
- エラーログ
-サービス
-MaxSize
現在、このようにタスクスケジューラを設定しています
プログラム/スクリプト:C:\ Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数を追加します(オプション):
-コマンド "&\ ServerName\C $\Users *****\Documents\Scripts\Scheduled-ServiceRestart.ps1
-ErrorLog 'ServerName\C $\Users *****\Documents\log\ScriptErrors.txt'
-サービス「foo1」、「foo2」
-MaxSize '5MB' "
スケジュールされたタスクを実行しても何も起こりません。
-File
ではなく-Command
パラメータを使用するようにタスクをスケジュールすることをお勧めします。例:
プログラム/スクリプト:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数を追加(オプション):-NoProfile -ExecutionPolicy Bypass -File 'Scheduled-ServiceRestart.ps1' -ErrorLog 'ScriptErrors.txt' -Services 'foo1','foo2' -MaxSize 5MB
開始(オプション):C:\Users\<username>\Documents\Scripts
タスクの[開始]プロパティでスクリプトの開始ディレクトリを指定し、スクリプトとログファイルへの長いパス名を避けることができます。 (私は、スクリプトをネットワークではなくローカルコンピュータで実行していると想定しているため、問題が発生する可能性があり、失敗する可能性があります。)
関数を最初にインポートする必要があります。関数をモジュールとして保存し、system32またはプログラムファイルのいずれかのモジュールフォルダーに配置することをお勧めします。このように、Powershellが起動すると、自動的に関数がインポートされます。
その後、タスクスケジューラは非常に簡単です。
プログラム/スクリプト
Powershell
引数を追加します(オプション):
-Command &{ServiceRestart -ErrorLog 'ServerName\C$\Users*****\Documents\log\ScriptErrors.txt' -Services 'foo1','foo2' -MaxSize '5MB'}
どうやら、スケジュールされたタスクを使用するとき、引用符の選択は大きな違いを生みます。あなたの議論のためにこれを試してください:
-Command "& '\\ServerName\C$\Users\...\Documents\Scripts\Scheduled-ServiceRestart.ps1' -ErrorLog '\\ServerName\C$\Users\...\Documents\log\ScriptErrors.txt' -Services 'foo1','foo2' -MaxSize '5MB'"
質問に対する文字通りの回答に関して:スクリプトの場所を囲むために単一引用符を追加する必要がある可能性があります。そうしないと、特殊文字/バックスラッシュをエスケープとして解釈しようとします。
例:
-Command "& '\ServerName\C$\Users*****\Documents\Scripts\Scheduled-ServiceRestart.ps1' ...
また、PowerShellスクリプトに基本的なログを追加して、スクリプトが実際に開始されていることを確認することもできます。
本番環境のPowershellスケジュールタスクでは「-Command&」スタイルを使用していますが、文字列が適切にフォーマットされていれば問題なく動作します。