4

psexec を使用して、リモートの Windows マシンで Perl プログラムを起動しています。プログラムは xcopy へのシステム コールを作成します。マシン上で直接 (ローカルに) 実行すると問題なく動作しますが、psexec を介してリモートで実行すると、xcopy は次のメッセージで失敗します。

ファイル作成エラー - 機能が正しくありません。

(ユーザーによっては、代わりに「アクセスが拒否されました」というメッセージが表示される場合があります。)

$! 次の診断を行います。

syscall.pl のファイル記述子が正しくありません。perl は REMOTE でエラー コード 9 で終了しました。

xcopy が system() を介して呼び出されるか、バックティックを介して呼び出されるかに違いはないようです。

「from」フォルダは ClearCase 動的ビュー (M ドライブ) であることを指摘しておく必要があります。

奇妙なことに、psexec から直接呼び出された場合、xcopy は正しく動作するようです。

ここにいくつかの他の奇妙な点があります:

  1. xcopy は常に失敗するとは限りません。特定のファイルは「呪われている」ように見えます。読み取り専用属性は要因ではないようです。

  2. コピーが成功すると (たとえば、Windows エクスプローラーを介して)、呪いが解除され、その特定のファイルが原因で xcopy エラーが発生しなくなります。

  3. 問題は宛先フォルダーにあるようには見えません。呪いが解除されると、ファイルを新しい宛先に 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
4

5 に答える 5

3

nullデバイスからINPUTをリダイレクトして、xcopyが機能するかどうかを確認してください。理由はわかりませんが、私はずっと前にこの問題に遭遇し、どういうわけか(おそらくWeb検索を介して)これを理解しました。

次のようになります。

xcopy /args $source $target <nul:;

(コマンド全体のバックチェックが表示されない)

JKE

于 2012-10-08T16:54:33.233 に答える
3

コマンドを使用する代わりに、xcopyPerl自体を使用してコピーを実行することをお勧めします。非常に簡単に使用できるモジュールFile::Copy::Recursiveがあります。これは標準のPerlディストリビューションの一部ではないため、を使用してインストールする必要がありますcpan

非ネイティブモジュールを使用したくない場合は、File :: Findを使用してディレクトリ内のファイルを検索し、それをFile::Copyと組み合わせることができます。

PerlMonksで2つの例が見つかりました。1つは組み合わせを使用し、もう1つはを使用しますFile::Copy::Recursive

はい、これはあなたの質問に直接答えるものではありませんがsystem、可能な場合はコマンドの使用を避けるようにしてください。システムシェルおよびコマンドプロセッサと対話する場合(特にClearCaseがファイルシステムをハッキングする場合)、意図しない対話が多数発生し、状況によっては機能するが、他の状況では機能しない場合があります。

呼び出しで発生している問題を把握するsystemには、エラーがClearCase、cmd.exeシェル、xcopyコマンド、またはPerlにある可能性があると想定する必要があります。コマンドを使用しないことsystemで、問題が単純化され、実際にプロセスが何度も高速化されます。

于 2012-05-10T14:38:55.103 に答える
2

system引数のリストを試しましたか?

my @args= qw(M:\STUFF\ABC D:\temp\dest1 /c /i /e);
warn "Executing 'xcopy @args' ...\n";
system xcopy => @args;
于 2012-05-10T13:41:37.323 に答える
1

ClearCase が Vob とビューの読み取り/書き込みアクセスを管理する方法を見ると、次の違いがあることがわかります。

  • ディレクトリの内容を読み取る (必要r-x)
  • ディレクトリ内のファイルの読み取り (ディレクトリの ' --x' +r--ファイルの " " だけが必要です)

そのため、xcopy を起動するプロセスの背後にいるユーザーによっては、特定のディレクトリ/ファイルの読み取り/アクセスに問題が発生する可能性があります。また、Vob にアクセスするために、正しい値 (つまり、VOB のプライマリ グループとしてリストされているグループ、またはそのセカンダリ グループの 1 つ)
が設定されていることを確認する必要があります(ただし、その保護が十分に緩い場合は、CLEARCASE_PRIMARY_GROUPとにかく誰でもアクセスできます)。

すべて動的ビューに適用され、スナップショット ビューの更新にのみ適用されます (更新が完了すると、ファイルがローカルにコピーされ、任意のプロセスで読み取ることができます)。

于 2012-05-11T20:26:28.590 に答える
1

File::Copy::Recursiveが問題を解決するかもしれません。

このようにして、より制御された方法でファイルをコピーできます。この呼び出しを eval ブロッ​​クにラップして、そこにある種の再試行ロジックを適用できますか?

問題のあるファイル ヘルプの「ダミー アップデート」でしょうか。ファイルの属性/タイムスタンプを変更するか、名前を別の名前に変更してから名前を元に戻します...

于 2012-05-10T07:53:36.283 に答える