psexec を使用して、リモートの Windows マシンで Perl プログラムを起動しています。プログラムは xcopy へのシステム コールを作成します。マシン上で直接 (ローカルに) 実行すると問題なく動作しますが、psexec を介してリモートで実行すると、xcopy は次のメッセージで失敗します。
ファイル作成エラー - 機能が正しくありません。
(ユーザーによっては、代わりに「アクセスが拒否されました」というメッセージが表示される場合があります。)
$! 次の診断を行います。
syscall.pl のファイル記述子が正しくありません。perl は REMOTE でエラー コード 9 で終了しました。
xcopy が system() を介して呼び出されるか、バックティックを介して呼び出されるかに違いはないようです。
「from」フォルダは ClearCase 動的ビュー (M ドライブ) であることを指摘しておく必要があります。
奇妙なことに、psexec から直接呼び出された場合、xcopy は正しく動作するようです。
ここにいくつかの他の奇妙な点があります:
xcopy は常に失敗するとは限りません。特定のファイルは「呪われている」ように見えます。読み取り専用属性は要因ではないようです。
コピーが成功すると (たとえば、Windows エクスプローラーを介して)、呪いが解除され、その特定のファイルが原因で xcopy エラーが発生しなくなります。
問題は宛先フォルダーにあるようには見えません。呪いが解除されると、ファイルを新しい宛先に xcopy できます。
以下は、問題を絞り込むために使用したテスト Perl スクリプトの一部です (フォルダー名は一般化されています)。テストした「my $cmd」ごとに、前のものをコメントアウトし、ステータス コメントを追加したことに注意してください。
# ClearCase directory M:\STUFF\ABC contains ABC.tst, ABC.zip and several nonempty subfolders
# Directory copy, D drive to D drive
#my $cmd = "xcopy D:\\temp\\src D:\\temp\\dest /e /i /y";
# works
# Directory copy, M drive to D drive
#my $cmd = "xcopy M:\\STUFF\\ABC D:\\temp\\dest /e /i /k /y";
# fails with "File creation error - Incorrect function" or "Access denied"
# File copy (.tst), M drive to D drive (trailing backslash)
#my $cmd = "xcopy M:\\STUFF\\ABC\\ABC.tst D:\\temp\\dest\\";
# works!
# Directory copy, M drive to D drive (trailing backslash)
#my $cmd = "xcopy M:\\STUFF\\ABC D:\\temp\\dest\\ /e /i /k /y";
# copies the .tst file, but fails on the .zip (yes, the .tst file is now getting copied)
# Directory copy, M drive to D drive (same as above but without trailing backslash)
#my $cmd = "xcopy M:\\STUFF\\ABC D:\\temp\\dest /e /i /k /y";
# copies the .tst file, but fails on the .zip
# File copy (.zip), M drive to D drive
#my $cmd = "xcopy M:\\STUFF\\ABC\\ABC.zip D:\\temp\\dest";
# fails
# File copy (.zip), M drive to D drive (trailing backslash)
#my $cmd = "xcopy M:\\STUFF\\ABC\\ABC.zip D:\\temp\\dest\\";
# fails
# After manually (Windows Explorer) copying the .zip file to the dest folder and deleting it
# Directory copy, M drive to D drive with /c (continue after failure)
#my $cmd = "xcopy M:\\STUFF\\ABC D:\\temp\\dest /c /i /e";
# copies the .tst and .zip file (!), but fails on all other files (folders were successfully created)
# After manually copying the Folder1 folder to the dest folder and then deleting it
#my $cmd = "xcopy M:\\STUFF\\ABC D:\\temp\\dest /c /i /e";
# copies the .tst and .zip file and the contents of Folder1(!), but fails on all other files
# Different dest:
my $cmd = "xcopy M:\\STUFF\\ABC D:\\temp\\dest1 /c /i /e";
# Same results as immediately above
print "Executing system command: $cmd ...\n";
system ($cmd);
#print(`$cmd 2>&1`); #same