web-dev-qa-db-ja.com

スケジュールされたタスクに引数を渡すにはどうすればよいですか?

タスクスケジューラには、バッチファイルを実行するSYSTEMアカウントを使用するタスクがあります。ユーザー(非管理者)には、タスクを実行する別のバッチファイルがあります。ユーザーのバッチは、タスクのバッチで使用できる変数をどのように設定できますか?

2
Jason

タスクスケジューラによって実行されるバッチスクリプトに変数値を動的に設定します

次のことを明確にして確認したので:

  1. Task SchedulerSYSTEMとして実行するバッチスクリプト内の変数値は、SIDと一致する値として設定する必要がありますログインスクリプトを実行するユーザーの
  2. タスクスケジューラが実行するスクリプトの場所には、マシンごとのローカルファイルパスを使用できます
  3. このスクリプトを実行する複数のユーザーが同じOSに同時にサインインすることはありません。

私はこのソリューションを、提案されたアプローチの詳細を含む別の回答として作成しました。

次のことを確認する必要があります。

  • 関連付けられたScheduled Taskの名前が、バッチスクリプトをローカルで実行する各マシンにセットアップされていることを確認します
  • schtasksで実行される各マシン上の各相関スケジュールされたタスクがすべて同じ1つの標準バッチスクリプトパスとファイル名を指していることを確認します。

バッチ[ログイン]スクリプトの例

すでに設定したロジックを再利用しましたが、いくつかの変数と条件付きを追加しました [〜#〜] if [〜#〜] ローカルマシンのローカルフォルダーをバッチにするロジックスクリプトは、まだ存在しない場合は常駐し、実行ごとに作成されてからすでに存在する場合は、そのフォルダー内のバッチファイル delete になります。

基本的に、これにより、実行されるたびに(ログイン時に)動的バッチスクリプトが作成されます。作成するバッチスクリプトには、Reg Addロジックとコマンドが含まれ、SID部分の値は、ログインスクリプトがログイン時に実行されたユーザーの値です。したがって、タスクスケジューラがスクリプトを実行すると、ログイン/スクリプトの実行ごとに必要な値がスクリプトに常に追加されます。

@ECHO ON

SET LocalDir=C:\localfolder
SET TaskScript=TaskScript.cmd

IF NOT EXIST "%LocalDir%" MD "%LocalDir%"
IF EXIST "%LocalDir%\%TaskScript%" DEL /Q /F "%LocalDir%\%TaskScript%"

for /f "tokens=2" %%i in ('whoami /user /fo table /nh') do set usersid=%%i

ECHO reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%usersid%" /v "State" /t REG_DWORD /d 128 /f>>"%LocalDir%\%TaskScript%"

schtasks /run /tn "My Profile Changer"

スケジュールされたタスク

schtasksに実行するように指示するタスク(つまり、"My Profile Changer")が、SET LocalDir=およびSET TaskScript=変数値のログインバッチスクリプトで指定するのと同じフルパスを指すようにする必要があるだけです。

したがって、ログインスクリプト変数がC:\localfolder\TaskScript.cmdと等しい場合、これはProgram/Scriptフィールドが指す値と同じです。 SET LocalDir=変数の値をStart in (optional):フィールドに入力することもお勧めしますが、引数を追加する必要がないため、Add Arguments (optional):フィールドを空白のままにするか、何も入れずに空のままにします(スクリーンショットの下)。

enter image description here


その他のリソース

2
Pimp Juice IT