Привет! Как можно написать скрипт, который копирует файлы с FTP-сервера в локальную сетевую папку? Я попытался создать такой скрипт: <br/> <pre><code class="bash">@Echo Off :: ~Параметры соединения Set $Host=IP Set $User=tuser Set $Pass=tpassword :: ~Что и куда копируем SET $SRC=ftp://IP/DIR/MRBTS2279.xml SET $DST=\\DOMAIN\DIR\MRBTS rem SET $DST=\\DOMAIN2.ru\C$\Users\DIR\scripts :: ~Временные файлы Set $FFtp=%~dpn0.cfg :: Готовим CFG-файл Echo.%$User%>"%$FFtp%" Echo.%$Pass%>>"%$FFtp%" Echo get "%$SRC%" "%$DST%">>"%$FFtp%" Echo bye>>"%$FFtp%" :: Выполняем команду FTP -s:"%$FFtp%" %$Host% rem exit pause</code></pre> <br/> Но скрипт выдает следующую ошибку: <br/> <pre><code class="bash">Связь с IP. 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. Пользователь (IP:(none)): 331 Please specify the password. 230 Login successful. ftp> get "ftp://IP/DIR/MRBTS2279.xml" "\\DOMAIN\DIR\MRBTS" 200 PORT command successful. Consider using PASV. Ошибка при открытии локального файла \\DOMAIN\DIR\MRBTS > \:═хшчтхёЄэ√щ ъюф ю°шсъш ftp> bye 221 Goodbye. Для продолжения нажмите любую клавишу . . .</code></pre> <br/> Если я добавляю кавычки, как показано здесь: <br/> <code class="bash">Echo get "%$SRC%" '"%$DST%"'>>"%$FFtp%"</code> <br/> то возникает другая ошибка: <br/> <pre><code class="bash">Связь с IP. 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. Пользователь (IP:(none)): 331 Please specify the password. 230 Login successful. ftp> get "ftp://IP/DIR/MRBTS2279.xml" '"\\DOMAIN\DIR\MRBTS"' 200 PORT command successful. Consider using PASV. 550 Failed to open file. ftp> bye 221 Goodbye.</code></pre> <br/> Я также пробовал ввести команду непосредственно в командной строке, но также возникли ошибки: <br/> <pre><code class="bash">ft
Привет! Давайте разберём ваш скрипт и устраним проблемы с ним. 1. **Параметры соединения**: Вместо использования `$`, используйте обычные переменные без `$` для определения переменных в BAT-файлах. 2. **Уровни доступа к папкам**: Убедитесь, что у вас есть полный доступ на запись в указанную сетевую папку. 3. **Проблемы с путями**: Убедитесь, что путь указан правильно, и учитывайте, что в Windows обратный слеш `\` является специальным символом, который нужно экранировать (использовать двойной обратный слеш `\\`). 4. **Форматирование**: Remove special formatting from the FTP commands, as FTP commands expect paths without quotes unless you have spaces in the paths. Используя приведенные выше советы, вот исправленный пример вашего BAT-скрипта: ```batch @echo off :: Параметры соединения set Host=IP set User=tuser set Pass=tpassword :: Что и куда копируем set SRC=/DIR/MRBTS2279.xml set DST=\\DOMAIN\DIR\MRBTS\MRBTS2279.xml :: Временные файлы set FFtp=%~dpn0.cfg :: Готовим CFG-файл ( echo %User% echo %Pass% echo get "%SRC%" "%DST%" echo bye ) > "%FFtp%" :: Выполняем команду ftp -s:"%FFtp%" %Host% :: Удаляем временный файл del "%FFtp%" pause ``` ### Комментарии к изменённому скрипту: - Удалены знаки `$` перед переменными, так как они не нужны в BAT-файлах. - FTP-путь для `SRC` задан без префикса `ftp://`, потому что FTP-клиент ожидает относительный путь к файлу. - Путь для `DST` указывает на полное имя файла, включая `.xml`, чтобы FTP-клиент знал, как назвать локальный файл. - Убедитесь, что у вас есть разрешение на запись в указанную директорию. ### Дополнительные советы: - Проверьте, что у вас настроен правильный доступ к сетевой папке. Попробуйте вручную скопировать файл в эту папку, чтобы убедиться, что права доступа правильные. - Проверьте, работает ли FTP-сервер и доступен ли по указанному IP-адресу. - Вы можете включить режим `PASV` в своих настройках FTP, если возникает проблема с соединением. Для этого добавьте команду `passive` в файл конфигурации. Запустите обновлённый скрипт и проверьте, исправила ли это вашу проблему!
Ошибка при открытии локального файла \\DOMAIN\DIR\MRBTSДык не понимает утилита ftp сетевые шАры (UNC-путь не понимает).
Сначала копируйте с ftp на локальный диск, потом с локального диска простой командой copy (ну или robocopy по вкусу) на сетевую шару.
Ну или попробуйте смонтировать шару на букву диска, и подставить в скрипт вместо UNC-пути как-бы-локальный-путь на этом диске.