3

バックティックを使用してWindows上のプログラムを呼び出すPerlスクリプトがあります。コマンドプロンプトで実行すると正常に動作します。Windowsタスクスケジューラを使用して実行すると動作を停止します。これは、ActiveStatePerlを搭載したWindowsServer2008x64上にあります。内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されないエラーが発生します。プログラムへの呼び出しを変更して、プログラムのフルパスを指すようにすると、プログラムは再び機能します。

したがって、バッククォートを使用してタスクスケジュールで実行すると、Windowsの環境変数、特に実行時に%PATH%変数が表示されなくなります。バックティックによって生成されたシェルから何かが欠落している可能性がありますか?システムコールを実行するために別のコマンドを使用する必要がありますか?または、これを解決するタスクスケジューラ設定はありますか?誰かが助けてくれるなら、私はそれをいただければ幸いです。

正直なところ、私の環境はこれよりも複雑ですが、これが私が絞り込んだものです。私は実際に、プログラムを実行するperlスクリプトを実行するphpスクリプトを実行するバッチファイルを含むタスクスケジュールを持っています。以前に言及しなかったスタックの残りの部分は%PATH%にアクセスできるようです。そのため、バッチファイルは「php ...」を実行し、phpスクリプトは「perl ...」を実行します。その後、perlスクリプトは失敗します。バッククォートを使用して「programname」を実行する場合。バッチファイルとphpスクリプトを削除しましたが、タスクスケジューラとperlだけで動作が持続します。

4

3 に答える 3

2

perl からパスを実行すると、基本的に問題を解決するのに役立ちました。問題は perl 自体ではありませんが、タスク スケジューラ サービスが再起動されるまで、%PATH% 変数への変更がタスク スケジューラに表示されないという事実です。私の知る限り、マシンを再起動せずにタスク スケジューラを再起動する方法はありません。そのため、タスク スケジュールで実行するとプログラム パスは表示されませんでしたが、コマンド ラインには表示されました。

これに対する2つの解決策を見つけました。

1 つは、マシンを再起動することです。

2 つ目は、タスク スケジュールが「ユーザーがログインしているかどうかに関係なく実行する」に設定されていることを確認することです (そのオプションに最も近いコマンド ライン パラメーターは、schtasks の /NP パラメーターです)。何らかの理由で、そのシナリオでスケジュールを実行すると、現在の %PATH% 変数にアクセスします。よくわかりませんが、これにより、デスクトップと対話する必要があるスクリプトが壊れると思います。

于 2012-05-13T18:38:49.757 に答える
0

管理アクセス権を持っている場合は、システム全体の を定義できます%PATH%。ユーザーが%PATH%それを拡張します。ユーザー アカウントでシステム上で実行されている通常のプログラムは、システム全体を認識できる必要があります%PATH%

タスクを GUI からスケジュールしたのか、または を使用してスケジュールしたのかはわかりませんATが、スケジュールされたジョブはユーザー環境変数にアクセスできません が役立つ場合があります。

于 2012-05-11T23:26:22.803 に答える