web-dev-qa-db-ja.com

PowerShellスクリプトはWindowsのスケジュールされたタスクとして実行されません

PowerShellスクリプト(動作する)があります。 Windowsタスクスケジューラで、"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"を実行する新しいタスクを作成し、PS1スクリプトとして引数を渡しました。タスクを実行すると、0x1の最終実行結果が得られます。

スクリプトが更新されたときにログファイルに書き込むようにスクリプトを更新しましたが、それは起こりません。タスクがPowershell.exeを開くことさえできないようです。

この音は正確ですか?問題は何ですか、またはどのように回避しますか?

28
ewitkows

発生している問題が実行ポリシーにある場合は、PowerShellの特定の呼び出しの実行ポリシーを設定することもできます。これは、スケジュールされたタスクを介してPowerShellを実行するときに通常行うことです。

powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1

どうして?

-NoProfile

これにより、 ユーザーのPowerShellプロファイルにあるものに依存しない が保証され、その追加コードを実行するオーバーヘッドが回避されます。

-NoLogo

これはほとんど問題ではありません。スクリプトの出力をキャプチャしている場合は、おそらくそうなります。ほとんどの場合、気分が良くなります。

-非インタラクティブ

スクリプト内の何かがユーザーに予期せずプロンプトを表示した場合に、タスクが無期限に待機しないようにします。このスイッチを使用すると、代わりにスクリプトが終了します。少なくとも、ハングするスクリプトの代わりにエラーコードが表示されます。

-ExecutionPolicy Bypass

ここでUnrestrictedを使用するか、任意の実行ポリシーを使用できます。 これがおそらく最も必要なものです

このように実行ポリシーを設定することを好む理由:

タスクをグローバルなデフォルト以外の設定に依存させたくないので、将来変更する他の理由があるかもしれません。他のプロセスが別の実行ポリシーに依存している場合、この方法でタスクと対立することはありません。

さらに、デフォルトを変更する必要がないことは常に素晴らしいことです。覚える/ドキュメント/テストする必要が少なくなります。

ボーナス

0x1の追加の原因については、JohnLBevanの回答を参照してください。スケジュールされたタスクになります

55
briantist

タスクスケジューラによって呼び出されたPowerShellスクリプトがコード0x1で完了するには、いくつかの原因が考えられます。

  • 実行ポリシーは、スクリプトの実行を許可しません。これについての詳細は Briantistの優れた答え をご覧ください。
  • タスクのRun with highest privilegesフラグ(タスクの[全般]タブのチェックボックス)は有効になっていません。*
  • パラメーターが誤ってスクリプトに渡されています。 -File ".\MyScript.ps1" -Parameter1 'Demo'などのアプローチを使用している場合は、代わりに-Command "& .\MyScript.ps1 -Parameter1 'Demo'"を試してください。

* Benはコメントで指摘しているように、Run with highest privilegesを有効にする必要はありません。スクリプトに管理者権限が必要かどうかによって異なります(たとえば、Set-ExecutionPolicyStop-Processなどのコマンドがこれらを必要とする場合)。よくわからない場合は、オプションをチェックして、問題が解決するかどうかを確認してください。違いがないようであれば、チェックしないでください。

5
JohnLBevan

私は以前にこれをやったことがあり、同様の問題がありました。ほとんどの場合、PowerShellのセキュリティ設定です。最も明らかに、私はあなたの実行ポリシーを再確認します(あなたがそれを設定したと仮定して)。

タスクはどのユーザーとして実行されますか?そのユーザーは以前にPowerShellスクリプトを実行しましたか?正しいことを覚えていれば、各ユーザーは(実行ポリシーに関係なく)初めてスクリプトを実行するときに、PowerShellスクリプトの実行を許可するように求められます(Y/N)。それは前に私をかみました。試してください:

  • そのユーザーとしてログイン
  • 実行ポリシーを確認する
  • powerShellプロンプトからスクリプトを開始する
  • 続くプロンプトに返信します。

最初の実行後、再度心配する必要はなく、タスクスケジューラから正常に実行する必要があります。

ドメインセキュリティによっては、グループ実行ポリシーを設定する必要がある場合もあります。これを行う方法の詳細と、確認するその他のいくつかの項目を次に示します。PowerShell Security

2
Aaron

前の回答は非常に価値があります。 Add Argumentsフィールドに以下の値を追加しました。

-noninteractive -nologo -command "&{path\to\script.ps1}"

アンパサンドを追加し、パスを中括弧で囲むようにしてください。アンパサンドの前と中括弧を閉じた後に二重引用符を付けることを忘れないでください。

1
Devesh3710

エラーメッセージがなく、問題がわからない場合-PowerShellスクリプトがスケジュールされたタスクから開始したくない理由がわからない場合は、次の手順を実行して回答を取得します。

  1. PowerShellスクリプトを実行するために、スケジュールされたタスクに設定されているユーザーとしてCMDを実行します
  2. PowerShellスクリプトがあるフォルダーを参照します
  3. PowerShellスクリプトを実行します($ ErrorActionPreference = 'silentlycontinue'などのスクリプト内にエラー通知が存在する場合、エラー通知をブロックするすべてのステートメントを削除します)

すべてのエラー通知を表示できるはずです。

私のスクリプトの1つでは、次のとおりでした。

タイプ[System.ServiceProcess.ServiceController]が見つかりません。このタイプを含むアセンブリがロードされていることを確認してください。

この場合、不足しているアセンブリを読み込むために、スクリプトの先頭に追加の行を追加する必要があります。

Add-Type -AssemblyName "System.ServiceProcess"

そして次のエラー:

「1」引数で「GetServices」を呼び出す例外:「コンピューター ''でサービスコントロールマネージャーを開けません。この操作には他の特権が必要な場合があります。」

select:プロパティ「データベース名」が既に存在するため、プロパティを処理できません