Я использую psexec для запуска программы Perl на удаленных компьютерах с Windows. Программа выполняет системный вызов xcopy. Это отлично работает при прямом (локальном) запуске на машинах, но при удаленном запуске через psexec xcopy завершается ошибкой со следующим сообщением:
Ошибка создания файла - Неправильная функция.
(В зависимости от пользователя вместо этого может отображаться сообщение «Доступ запрещен».)
Обратите внимание, что $! дает следующую диагностику:
Неверный файловый дескриптор на syscall.pl. perl завершился на УДАЛЕННОМ УДАЛЕНСТВЕ с кодом ошибки 9.
Кажется, не имеет значения, вызывается ли xcopy через system () или через обратные кавычки.
Я должен отметить, что папка «от» представляет собой динамическое представление ClearCase (диск M).
Как ни странно, похоже, что xcopy работает правильно, когда вызывается непосредственно из psexec.
Вот еще несколько странностей:
Xcopy не всегда терпит неудачу. Некоторые файлы просто кажутся «проклятыми». Атрибут только для чтения не играет роли.
После успешного копирования (например, через проводник Windows) проклятие снимается, и этот конкретный файл больше не вызывает ошибок 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
system ($cmd) or die "'$cmd' failed: $!";
это должно сказать вам, что это за сообщение об ошибке, если оно существует (я думаю, что это будет более надежным, чем ваша команда печати). - person Barton Chittenden   schedule 10.05.2012$!
только в случаеsystem
успеха. Вместо этого используйтеsystem ($cmd) and die "'$cmd' failed: $!"
. Подробнее см. perldoc -f system. Также используйте формуLIST
, как я предлагал. - person Sinan Ünür   schedule 10.05.2012$!
и не заметил этого. - person Barton Chittenden   schedule 11.05.2012