37

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

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

これは正確に聞こえますか?問題は何である可能性がありますか、またはどのように回避しますか?

4

6 に答える 6

66

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

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

なんで?

-NoProfile

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

-NoLogo

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

-非対話型

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

-ExecutionPolicyバイパス

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

この方法で実行ポリシーを設定することを好む理由:

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

さらに、デフォルトを変更する必要がないのは常に素晴らしいことです。覚えにくい/文書化/テストする。

ボーナス

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

于 2014-08-07T00:04:58.650 に答える
7

タスクスケジューラによって呼び出された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。よくわからない場合は、オプションにチェックマークを付けて、問題が解決するかどうかを確認してください。違いが見られない場合は、チェックを外したままにします。

于 2017-03-14T00:31:54.400 に答える
3

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

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

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

最初の実行後は、それについて再度心配する必要はなく、タスクスケジューラから問題なく実行されるはずです。

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

于 2012-10-22T16:23:10.143 に答える
2

前の答えは非常に価値があります。[引数の追加]フィールドに以下の値を追加しました。

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

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

于 2017-10-20T05:14:03.937 に答える
0

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

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

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

私のスクリプトの1つでは、次のようになりました。

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

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

Add-Type -AssemblyName "System.ServiceProcess"

そして次のエラー:

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

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

于 2018-09-07T10:07:41.520 に答える
0

@briantistからの上記の回答を使用してこの問題を解決しましたが、問題を解決しているスイッチを正確に特定したいと思いました。

、、、、またはその他のシステム権限、スクリプトを実行しているユーザーアカウントなどと-ExecutionPolicyは何の関係もありませんでした。-Noninteractive-NoLogo-NoProfile

フィールドのスクリプトパスの前に-Fileを追加する必要がありTask Scheduler > Actions > Argumentsます。このスイッチがないと、PowerShellが起動し、タスク履歴が表示されてAction Completedいましたが、スクリプトは実行されていませんでした。

于 2020-12-08T19:15:56.743 に答える