Если вы не хотите включать ftp на своих серверах, другим вариантом будет использование RoboCopy для синхронизации серверов. Мне очень повезло с этим инструментом. Вам потребуется доступ к тегу cfexecute
ColdFusion, и вам нужно будет создать общие ресурсы на своих серверах.
RoboCopy — это исполняемый файл, поставляемый с Windows. Вы можете прочитать некоторую документацию здесь и здесь. Он имеет несколько очень мощных функций и может быть настроен на «зеркальное отражение» содержимого каталогов с одного сервера на другой. В этом режиме папки будут оставаться идентичными (добавляются новые файлы, удаляются удаленные файлы, копируются обновленные файлы и т. д.). Вот как я его использовал.
По сути, вы создадите общий ресурс на своих целевых серверах и предоставите доступ определенному пользователю (может быть локальным или доменным). На исходном сервере вы запустите некоторый код ColdFusion, который:
- Логически сопоставляет диск с целевым сервером
- Запускает утилиту RoboCopy для копирования файлов на целевой сервер.
- Затем отключает сопоставленный диск
Службе ColdFusion на исходном сервере потребуется доступ к C:\WINDOWS\system32\net.exe
и C:\WINDOWS\system32\robocopy.exe
. Если вы используете безопасность изолированной программной среды ColdFusion, вам потребуется добавить записи для этих исполняемых файлов (только на исходном сервере). Вот несколько основных примеров кода.
Сначала сопоставьте целевой сервер:
<cfexecute name="C:\WINDOWS\system32\net.exe"
arguments="use {share_name} {password} /user:{username}"
variable="shareLog"
timeout="30">
</cfexecute>
Здесь {share_name} будет что-то вроде \\server\c$
. {username} и {password} должны быть очевидны. Вы можете указать имя пользователя как \\server\username
. ПРИМЕЧАНИЕ Я бы предложил использовать созданный вами общий ресурс, а не административный общий ресурс c$
, но это то, что было в вашем примере.
Затем скопируйте файлы с исходного сервера на целевой сервер:
<cfexecute name="C:\WINDOWS\system32\robocopy.exe"
arguments="{source_folder} {destination_folder} [files_to_copy] [options]"
variable="robocopyLog"
timeout="60">
</cfexecute>
{source_folder} здесь будет что-то вроде C:\folder1\folder2\folder3\folder4\folder5\
, а {destination_folder} будет \\server\c$\folder1\folder2\folder3\folder4\folder5\
. Вы должны начать этот аргумент с {share_name} из шага выше, за которым следует желаемый путь к каталогу. [files_to_copy] — это список файлов или подстановочный знак (*.*
), а [options] — это опции RoboCopy. См. ссылки, которые я включил для полного списка опций. Это обширно. Чтобы отразить структуру папок, используйте параметры /E
и /PURGE
. Я также обычно включаю параметры /NDL
и /NP
, чтобы ограничить генерируемый вывод. И /XA:SH
для исключения системных и скрытых файлов. И /XO
, чтобы не копировать старые файлы. Вы можете исключить другие файлы/каталоги специально или с помощью подстановочных знаков.
Затем отключите сопоставленный диск:
<cfexecute name="C:\WINDOWS\system32\net.exe"
arguments="use {share_name} /d"
variable="shareLog"
timeout="30">
</cfexecute>
Работает как шарм. Если вы пойдете по этому пути и раньше не использовали RoboCopy, я настоятельно рекомендую сначала поиграть с параметрами/функциональными возможностями, используя командную строку. Затем, как только вы заставите его работать по своему вкусу, просто вставьте эти параметры в приведенный выше код.
person
Miguel-F
schedule
09.04.2013
C:
, я знаю, что разрешения правильные — запись наC:
является локальной для этого сервера, поэтому у него есть права. Запись на\\server
не является локальной, поэтому необходимо использовать пользователя с правами на этот сервер. Это работало для вас в браузере, потому что браузер использовал ваши права, а не сервер ColdFusion. - person Miguel-F   schedule 09.04.2013