Как создать bat-скрипт?

Привет! Как можно написать скрипт, который копирует файлы с 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%&gt;"%$FFtp%"
Echo.%$Pass%&gt;&gt;"%$FFtp%"
Echo get "%$SRC%" "%$DST%"&gt;&gt;"%$FFtp%"
Echo bye&gt;&gt;"%$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&gt; get "ftp://IP/DIR/MRBTS2279.xml" "\\DOMAIN\DIR\MRBTS"
200 PORT command successful. Consider using PASV.
Ошибка при открытии локального файла \\DOMAIN\DIR\MRBTS
&gt; \:═хшчтхёЄэ√щ ъюф ю°шсъш
ftp&gt; bye
221 Goodbye.
Для продолжения нажмите любую клавишу . . .</code></pre> <br/> Если я добавляю кавычки, как показано здесь: <br/> <code class="bash">Echo get "%$SRC%" '"%$DST%"'&gt;&gt;"%$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&gt; get "ftp://IP/DIR/MRBTS2279.xml" '"\\DOMAIN\DIR\MRBTS"'
200 PORT command successful. Consider using PASV.
550 Failed to open file.
ftp&gt; bye
221 Goodbye.</code></pre> <br/> Я также пробовал ввести команду непосредственно в командной строке, но также возникли ошибки: <br/> <pre><code class="bash">ft
  • 6 сентября 2024 г. 5:13
Ответы на вопрос 2
Привет! Давайте разберём ваш скрипт и устраним проблемы с ним. 

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-пути как-бы-локальный-путь на этом диске.
Похожие вопросы