自動化プロセスの一部としてスケジュールされたタスクを作成するPowerShellスクリプトがあり、構文は次のとおりです。
schtasks /create /s ServerName /u $username /p $password /ru $username /rp $password /sc once /sd $StartDate /st $StartTime /tn $taskname /tr "\\ServerName\c$\$TaskName\$Taskname.bat"
タスクは正常に作成されますが、実行時間になると、常にエラー(0X1)で失敗します。
バッチファイルを個別に実行すると、完全に実行されます。そのため、スケジュールタスクが間違って作成されています。
次に、「start-in」ディレクトリパスを指定すると機能することがわかりました。
私の質問は、タスクのプロパティで「オプション」と明確に示されているのに、パスの開始を提供する必要があるのはなぜですか?
私の他の質問は、パスの開始をどのように提供するかです。多くの方法を試しましたが、すべてが失敗しましたが、それを自動化する方法はありませんか?すべてのタスクを手動で更新する必要がありますか?
私の質問は、タスクのプロパティで「オプション」と明確に示されているのに、パスの開始を提供する必要があるのはなぜですか?
たとえば、Powershellスクリプトを実行するスケジュールされたタスクを作成しているとしましょう。
なぜこれが間違っているのですか?まず、スケジュールされたタスクを実行するユーザーのPATH環境変数が正しく設定されているかどうかがわからないため、powershell.exeが正しく解決されるかどうかはわかりません。システムまたはドメインユーザーのどちらとしてタスクを実行するように設定したかによって、それらのPATH変数は異なります。時々それは動作し、powershell.exeは適切に起動されますが、先に進んで当て推量を取り除き、powershell.exe実行可能ファイルの完全修飾パス名を指定してください。
第二に、script.ps1はどこにありますか?あなたは指定しませんでした。 Powershellが起動し、起動ディレクトリは%WINDIR%\System32
になります。スクリプトを保存した場所でない限り(そうでないことを願っています)、Powershellはスクリプトを見つけることができません。
実行可能ファイルとスクリプトの両方に完全修飾パス名を指定したので、これはより良い方法です。しかし、「Start in(オプション)」の目的はまだわかっていません。ちょっと待ってください、私たちはそこに着きます。
したがって、script.ps1
の内容は次のとおりです。
"Hello world!" | Out-File test.txt
では、上記のスケジュールされたタスクを実行して、Powershellを起動し、script.ps1を実行するとしたら、test.txtはどこに書き込まれると思いますか?
%WINDIR%\System32
を推測した場合は、Cookieを取得します。
Test.txtを代わりにC:\Scripts
に移動させたい場合は、[Start in(オプション)]フィールドにC:\Scripts
と入力します。
それがオプションである理由です。
また、スクリプトで完全修飾パス名を使用して、PATH変数や作業ディレクトリを気にすることなく、目的の場所に移動することで、これを回避できることも指摘しておく必要があります。
次に、2番目の質問に移ります。
schtasks.exeには、スケジュールされたタスクの「開始」または「作業ディレクトリ」を追加する機能がないようです。バマー。
実行できることの1つは、タスクスケジューラ2.0タスクにXMLを使用することです。これにより、作業ディレクトリを設定できます。この質問のために作成したテストタスクのXMLは次のとおりです。
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.Microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2013-07-19T09:41:27.0446696</Date>
<Author>DOMAIN\user</Author>
</RegistrationInfo>
<Triggers />
<Principals>
<Principal id="Author">
<UserId>DOMAIN\user</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>C:\Scripts\script.ps1</Arguments>
<WorkingDirectory>C:\Scripts</WorkingDirectory>
</Exec>
</Actions>
</Task>
schtasks /XML
を使用して、XMLファイルからスクリプト的にタスクをインポートできます。
私はこれに自分で遭遇しました。私の場合、問題はスクリプト自体のエラーが原因でしたが、エラーは実行中に到達することのなかったスクリプトの一部にありました。
問題のトラブルシューティングを行うには、スクリプトを実行するユーザーとしてアクション全体を実行してみてください。たとえば、最初にPowerShellをターゲットユーザーとして開きます(自分ではない場合)。
RunAs /user:domain\serviceaccount PowerShell.exe
次に、PowerShellでアクションブロック全体を実行し、エラーが発生するかどうかを確認します。
PowerShell.exe -ExecutionPolicy Bypass -File "C:\Scripts\My-Automated-Task.ps1"