web-dev-qa-db-ja.com

タスクスケジューラ内でPowershellパラメーターを渡す

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' "

スケジュールされたタスクを実行しても何も起こりません。

5
Myron Walters

-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

タスクの[開始]プロパティでスクリプトの開始ディレクトリを指定し、スクリプトとログファイルへの長いパス名を避けることができます。 (私は、スクリプトをネットワークではなくローカルコンピュータで実行していると想定しているため、問題が発生する可能性があり、失敗する可能性があります。)

6
Bill_Stewart

関数を最初にインポートする必要があります。関数をモジュールとして保存し、system32またはプログラムファイルのいずれかのモジュールフォルダーに配置することをお勧めします。このように、Powershellが起動すると、自動的に関数がインポートされます。

その後、タスクスケジューラは非常に簡単です。

プログラム/スクリプト

Powershell

引数を追加します(オプション):

-Command &{ServiceRestart -ErrorLog 'ServerName\C$\Users*****\Documents\log\ScriptErrors.txt' -Services 'foo1','foo2' -MaxSize '5MB'}
2
Jessie

どうやら、スケジュールされたタスクを使用するとき、引用符の選択は大きな違いを生みます。あなたの議論のためにこれを試してください:

-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&」スタイルを使用していますが、文字列が適切にフォーマットされていれば問題なく動作します。

0
Coruscate5