Для проекта у меня должен быть пакетный скрипт, отвечающий за загрузку файлов по FTP. Для облегчения отладки/сообщения нам о возникновении проблемы, если загрузка по FTP не удалась, я хотел бы отправить письмо со списком файлов, которые не были загружены. Вот где я застрял.
setlocal enabledelayedexpansion
REM winscp script call here
set exitCode=%ERRORLEVEL%
set file_list=
set file_count=0
set export_dir=D:\data\dir1\dir2
pause
echo Checking files in %export_dir%
dir %export_dir%
pause
REM issue here, with the loop probably
for %%i in (%export_dir%\*) do (
set "filename=%%~nxi"
echo Found file: !filename!
set file_list=!file_list!!filename!<br>
set /a file_count+=1
)
echo File List: !file_list!
echo File Count: %file_count%
pause
Что-то не так с циклом, и я не могу понять, что. Где и чем мне его испортить? Спасибо заранее!
Я понял, что включенное расширение необходимо, но все равно не работает. Пробовал записать содержимое каталога во временный файл, не помогло..
По сути, ваша проблема связана с экранированием редиректоров.
Я также предполагаю, что желаемый список файлов должен представлять собой список файлов, которые не были скопированы, но ваш код, похоже, направлен на сообщение о тех файлах, которые были скопированы.
Тем не менее, я бы посоветовал вам заменить раздел проблемы на ~
set /a file_count=0
:: remove variables starting file_list
FOR /F "delims= = " %%e In ('set file_list 2^>Nul') DO SET "%%e = "
for %%i in (file1.txt file2.ext "file3 with space.wrx") do (
echo Found file: %%~nxi
set "file_list=!file_list!:%%~nxi"
set /a file_count+=1
SET "file_list[!file_count!]=%%~nxi"
)
SET "file_list=%file_list::=^<br^>%"
ECHO File list %file_list:~6%^<br^>
FOR %%e IN (1,1,%file_count%) DO ECHO !file_list[%%e]!^<br^>
Который реализует два разных подхода к проблеме. Что вы выберете, зависит от того, чего вы на самом деле хотите, чего вы не указали.
Обратите внимание, что я просто задал цикл фиксированными именами файлов для тестирования. Естественно, вы должны изменить for
, чтобы передать в цикл необходимые данные.
Метод 1:
Если требуемый результат — file1<br>file2<br>file3<br>
, используйте только строки, не содержащие [
. Это создает file_list
так, как вы изначально задумали, но с двоеточием в начале и между именами файлов. Двоеточие, поскольку двоеточие не может присутствовать в имени файла. Когда список будет построен, замените каждое двоеточие на ^<br^>
и покажите результат, исключив первые 6 символов и добавив ^<br^>
в конец.
Метод 2:
Если требуемый результат
file1<br>
file2<br>
file3<br>
затем используйте строки, содержащие [
. Это присваивает имена файлов file_list[n]
, по одному каждому имени файла, затем просто перечислите их и добавьте ^<br^>
Я предполагаю, что выходные данные передаются в файл для передачи, поэтому используйте >>filename ECHO
вместо ECHO
, чтобы добавить требуемый вывод в файл.
Естественно, остерегайтесь ограничения на переменную длину и влияния пакетно-зависимых символов, таких как !%^&
, в обрабатываемых именах файлов.
Совет: используйте set "var=value"
для установки строковых значений — это позволит избежать проблем, вызванных конечными пробелами. Не назначайте "
, обратную косую черту или пробел. Создавайте пути из элементов — как ни странно, это, вероятно, облегчит процесс. Если используется синтаксис set var = "value"
, кавычки становятся частью присвоенного значения.
Спасибо за подробное решение. К сожалению, я не могу проголосовать за вас, так как мой аккаунт все еще находится в стадии разработки. Безумное уважение таким старичкам, как вы!
Я не согласен с вашим утверждением «включить отложенное расширение необходимо». Все зависит от того, как вы собираетесь использовать выходные данные, например.
@(For %%G In ("%export_dir%\*") Do @Set /P "=%%~nxG<br>" 0<NUL) & Echo(
.