Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/55: Рейтинг темы: голосов - 55, средняя оценка - 4.98
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11

Проверка папки на наличие файлов и её очистка с выводом сообщения

22.06.2016, 04:06. Показов 12159. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Выложу сразу код:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set df1=C:\folder1
set df2=C:\folder2
 
dir %df1% /a:d >nul 2>nul 
if errorlevel=1 ( echo Папка пуста.
) else ( 
goto :del1 )
goto :EOF
:del1
echo Обнаружены файлы в папке C:\folder1.
pushd "%df1%"
2>nul RD /s /q "%df1%" 
popd
echo C:\folder1 очищена.
А теперь к сути.
Хотел написать маленький батник на проверку и очистку файлов в папке, а в последующем - нескольких папок. Проблема заключается в условии if. При запуске батника, сразу идёт к выполнению :del1. При этом, заменяя вывод сообщения (echo) при errorlevel'е равном 1-му на переход к метке, к примеру:
Windows Batch file
1
2
3
4
5
if errorlevel=1 ( goto :text
) else ( 
goto :del1 )
:text
echo Папка пуста.
- всё работает верно. Проверка на наличие файлов и папок происходит корректно, и условия выполняются. Но в первом варианте кода всегда выполняется :del1 независимо от того, пуста папка или нет (и вывод сообщения о том, что папка пуста не производится).
Надеюсь на вашу помощь, уважаемые форумчане. Сам я не особо силён в этой сфере, т.к. только недавно в неё окунулся.
Хотелось бы разобраться, где моя ошибка.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2016, 04:06
Ответы с готовыми решениями:

Проверка папки на наличие в ней файлов
Добрый день,у меня возникли подозрения что этот код выдает ошибку когда он находит пустую папку,как с этим справиться? Set...

Проверка папки на наличие ini файлов
Такая ситуация. Я организовал програмку-тест, результат теста она выводит в ini файлы в папку "Report". Каждому отчету она...

Определение нужной папки и проверка на наличие в ней файлов
Здравствуйте, помогите пожалуйста решить проблему.. необходимо вывести диалоговое окно, в котором пользователь должен будет указать папку с...

25
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
22.06.2016, 06:07
Цитата Сообщение от John Doe Посмотреть сообщение
if errorlevel=1
Так условный блок не используется, "=" - это оператор присвоения, а не равенства... должно быть:
Windows Batch file
1
if %errorlevel%==1 ...
или
Windows Batch file
1
if errorlevel 1 ...
Почитать надо:
Windows Batch file
1
if /?
А вообще, если папки временные и предназначены для очистки, то проверка наличия файлов, особого смысла не имеет. Можно сразу приступать к очистке - если файлов нет, то и удалять будет нечего, надо просто перенаправить вывод потоков на экран и ошибок в нуль, (в конце команды или в начале) через пробел:
Windows Batch file
1
1>nul 2>&1
1
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
22.06.2016, 14:23  [ТС]
Подумал, что мой косяк и глаза замылились.
Но, увы, варианты с %errorlevel%==... и errorlevel 1 тоже не сработали.
И это странно, что с echo не работает, а с goto всё работает как надо. Но через "goto" не вариант. Т.к. папок будет больше в дальнейшем. И прописывать для каждой условия с бесконечными переходами "goto" напряжно и громоздко.
Проверка нужна, т.к. делаю не для себя. И как я понял, этот аспект важен.
В идеале, нужно ещё и кол-во удалённых файлов вывести и общий вес.
Может проблема в синтаксисе? но я сколько не прошаривал глазами, ничего не заметил.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
22.06.2016, 20:17
Лучший ответ Сообщение было отмечено John Doe как решение

Решение

Цитата Сообщение от John Doe Посмотреть сообщение
И это странно, что с echo не работает, а с goto всё работает как надо.
Ни echo, ни goto тут не при чём...
Цитата Сообщение от John Doe Посмотреть сообщение
dir %df1% /a:d >nul 2>nul
посмотрите, что будет в errorlevel, запустив такой батник для пустого каталога и для каталога с файлами
Windows Batch file
1
2
3
dir C:\folder1 /a:d >nul 2>nul
echo %errorlevel%
pause
- это Ваш вариант.
теперь проделайте то же самое, для этого пакета:
Windows Batch file
1
2
3
dir C:\folder1 /a-d >nul 2>nul
echo %errorlevel%
pause
- найдите отличие.
Windows Batch file
1
dir /?
С остальным позже разберемся, сейчас времени не очень много осталось...

Добавлено через 5 часов 16 минут
Цитата Сообщение от John Doe Посмотреть сообщение
В идеале, нужно ещё и кол-во удалённых файлов вывести и общий вес.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
set "d1=C:\TEST1"
set "d2=C:\TEST2"
set n=0
set m=0
for /f "tokens=3" %%a in ('dir /s/-c/a-d "%d1%" "%d2%" 2^>nul ^|findstr /rc:"^[^ ]"') do (
    set /a n+=1
    set /a m+=%%a
)
(echo Всего файлов - %n%&&echo Общий размер файлов - %m% байт&&echo.) >>%temp%\delete.log
for /f "delims=" %%i in ('dir /b/s/a "%d1%" "%d2%"') do (
    if exist "%%i\" (echo Удалён каталог - %%i >>%temp%\delete.log&&rd /s/q "%%i" )
    del /f/s/q/a "%%i" 2>nul >>%temp%\delete.log
)
1
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
23.06.2016, 02:29  [ТС]
Действительно работало с goto. Выдавало echo если папка пуста. И когда для теста накидывал файлы, работал 2 вариант условия. Но после теста параметра /a-d и /a:d, понял, что работало всё некорректно. Пуста папка или нет /a:d возвращает 0.
/a-d возвращает errorlevel 1 если папка пуста и 0 если есть файлы. Но! Если в папке нет файлов с расширениями, а только подпапки (пустые или с файлами - без разницы, тестил), errorlevel всё равно выдаёт 1, как будто папка пуста.
Как мне поступить в этом случае. Какие есть идеи? Чтобы проверял как наличие файлов так и папок.
Я вроде не глупый, но только недавно начал в этом плавать. Поэтому извиняюсь за свои тормоза.

Код, который вы написали, я так понял, ведёт подсчёт файлов и веса.
Хотелось бы понять, что к чему и почему. Если не составит труда, прокомментируйте строки вашего кода, дабы до меня дошло сие чудо вашей мысли Буду признателен.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
23.06.2016, 06:17
Цитата Сообщение от John Doe Посмотреть сообщение
Пуста папка или нет /a:d возвращает 0.
/a-d возвращает errorlevel 1 если папка пуста и 0 если есть файлы.
Это всего лишь ключ,определяющий работу команды dir, поэтому он ничего не возвращает... Чтобы понять как всё работает в этой команде, наберите dir /?, там описаны ключи.

Цитата Сообщение от John Doe Посмотреть сообщение
Но! Если в папке нет файлов с расширениями, а только подпапки (пустые или с файлами - без разницы, тестил), errorlevel всё равно выдаёт 1, как будто папка пуста.
Теперь вместо /a-d, вставьте в строку /a и посмотрите на результат.
После чего измените код на такой:
Windows Batch file
1
2
3
dir C:\folder1 /s/a-d >nul 2>nul
echo %errorlevel%
pause
и потестируйте с подпапками, с файлами и без...

Цитата Сообщение от John Doe Посмотреть сообщение
Если не составит труда, прокомментируйте строки вашего кода
Такой комментарий мало чему научит... Давайте так, Вы почитаете справку к командам, потестируете код в необходимой папке (папках), попробуете прокомментировать его самостоятельно, а я уже поправлю, в случае ошибки...
1
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
23.06.2016, 20:44  [ТС]
Заменил ключ /a-d на /a, хотя я в принципе уже так пробывал. При любом раскладе даёт 0.
Протестировал ключ /s/a-d. Если есть файлы, выдаёт 0. Если есть папки с файлами, выдаёт ноль. Но если есть пустые папки, выдаёт 1.

Научит, если объяснить, что именно проделывает команда и её параметры. Справкой в cmd я пользоваться умею. К сожалению, не всё в ней предельно ясно и однозначно. Разве что, для опытных людей в этом деле.
Касательно кода, что вы написали. Я так понял, что его нужно запускать из папки, которую чистим?
Я подставил соответствующие папки в df1 и df2.
Скажем так, ничего нигде не тронуло. А вот рабочий стол мой почти весь снесло, включая файлы которые были мне нужны. Ну да не столь важны теперь. Остались разве что ярлыки, выборочно. Часть снесло, часть оставило. И сам себя батник снёс.
В логе подсчёт файлов - 0, объём - 0. И перечислены файлы и каталоги, которые были удалены.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
23.06.2016, 21:43
Лучший ответ Сообщение было отмечено John Doe как решение

Решение

Цитата Сообщение от John Doe Посмотреть сообщение
Я подставил соответствующие папки в df1 и df2.
Скажем так, ничего нигде не тронуло. А вот рабочий стол мой почти весь снесло, включая файлы которые были мне нужны.
Всё зависит от того, что именно Вы присвоили в переменные %df1% и %df2% и зачем именно эти переменные использовались. Если Вы заметили, то у меня там переменные %d1% и %d2% и в них прописан абсолютный путь к папкам, а также в коде используются тоже только абсолютные пути, поэтому батник можно запускать из любого места, кроме самих очищаемых папок. Естественно, что папки должны существовать. Если же в правильные пременные прописывать относительные пути, тогда будет иметь значение место запуска сценария и то, с какими правами запускать этот сценарий. Последнее особенно важно, т.к. при отсутствующих папках или не найденных путях, консоль может принять "замечательное решение" сменить текущий путь на путь к папке пользователя и соответственно, там похозяйничать.
Вообще, если проводите какие-либо эксперименты, особенно с потенциально деструктивными действиями, то лучше сначала выводить всё с помощью команды echo в консоль или в файл и только убедившись в том, что всё работает как надо, заменять вывод на реальные команды.

Вот код с комментариями:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
rem Инициализируем переменные с присваиванием значений абсолютных путей к интересующим каталогам
set "d1=C:\TEST1"
set "d2=C:\TEST2"
rem Инициализируем счетчики
set n=0
set m=0
rem Цикл подсчета количества и общего размера файлов в папке и её подпапках
for /f "tokens=3" %%a in ('dir /s/-c/a-d "%d1%" "%d2%" 2^>nul ^|findstr /rc:"^[^ ]"') do (
    set /a n+=1
    set /a m+=%%a
)
rem Выводим результат подсчета в файл
(echo Всего файлов - %n%&&echo Общий размер файлов - %m% байт&&echo.) >>%temp%\delete.log
rem Цикл удаления всего: и папок, и файлов в нужных каталогах - в данном случае, в двух каталогах. 
rem Можно использовать один или более каталогов, здесь это переменные d1 и d2 в качестве путей команды dir
for /f "delims=" %%i in ('dir /b/s/a "%d1%" "%d2%"') do (
    rem Проверяем каталог ли это и если каталог, удаляем вместе со всеми подпапками и файлами, с выводом в файл
    if exist "%%i\" (echo Удалён каталог - %%i >>%temp%\delete.log&&rd /s/q "%%i" )
    rem Удаляем файлы в основном каталоге с выводом в файл
    del /f/s/q/a "%%i" 2>nul >>%temp%\delete.log
)
1
2 / 2 / 1
Регистрация: 23.04.2015
Сообщений: 56
24.06.2016, 14:29
Windows Batch file
1
2
3
4
5
6
@echo off
set folder1= "C:\TEST1"
if exist %folder1% goto delete
:delete
del %folder1%\*.*
exit /b
0
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
25.06.2016, 06:07  [ТС]
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
set "d1=C:\TEST"
set "d2=C:\TEST2"
set "d3=%appdata%\Local\TEST"
set n=0
set m=0
 
for /f "tokens=3" %%a in ('dir /s/-c/a-d "%d1%" "%d2%" "%d3%" 2^>nul ^|findstr /rc:"^[^ ]"') do (
    set /a n+=1
    set /a m+=%%a
)
(echo Всего файлов - %n%&&echo Общий размер файлов - %m% байт&&echo.) >>%temp%\delete.log
 
for /f "delims=" %%i in ('dir /b/s/a "%d1%" "%d2%" "%d3%"') do (
    if exist "%%i" (echo Удалён каталог - %%i >>%temp%\delete.log&&rd /s/q "%%i" )
    del /f/s/q/a "%%i" 2>nul >>%temp%\delete.log
)
В общем. Протестировал и с пустыми папками, и с пустыми подпапками, и с файлами и т.д.
Всё чистит.
Но, предположим, что какая то директория может быть удалена. Боюсь того же, что случилось с моим десктопом.
Думал, как бы всунуть сюда проверку заданной директории на существование. Как-то у меня не срослось, ведь они все в теле цикла For.

Касательно данного батника и комментариев.
Задали некие переменные n и m для счётчика.
После собственно реализуется сам счётчик, не совсем понял, почему переменной %%a нужна именно 3-я подстрока tokens.
что делает ^|findstr /rc:"^[^ ] в этом цикле я так же не догнал. Далее за каждый обработанный файл переменной n присваевается 1, и того с миру по нитке во что-нибудь да выльется. Переменной %%a передаётся вес каждого файла и это всё тикает в переменную m.
Далее всю эту информацию мы выводим в лог-файл.
Следующий цикл реализует удаление каталогов и файлов в указанной директории. переменной %%i передаётся каждый "файл" и если это каталог, передаётся соответствующая информация в лог-файл и делается чёрное дело. Затем подчищаются все оставшиеся файлы в основной директории и информация снова передаётся в лог. Если где-то не так понял, поправьте. И если не затруднит, прошу дать толчка там, где я не догнал.

Так как же здесь реализовать проверку заданного каталога на истинность. Ведь все директории прописываются в цикл, независимо от того, реальны они или нет.
Пробовал реализовать вывод информации об удалении на экран без лог файла. Вывод информации об удалённом файле дублируется. А каталог выводится и как удалённый каталог и как файл с тем же путём каталога.
Если передавать в лог, то всё в порядке.

Очень благодарен, что вы терпимо тратите на меня своё время!
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
25.06.2016, 10:26
Цитата Сообщение от John Doe Посмотреть сообщение
Боюсь того же, что случилось с моим десктопом.
чтобы не было страшно экспериментировать, установите виртуальную машину, в ней можно добавить хоть несколько гостевых ОС, хоть одну, причем разных версий. Например, у меня установлена Oracle VM VirtualBox. А потом уже в этих гостевых ОС запускайте что угодно...

Цитата Сообщение от John Doe Посмотреть сообщение
Думал, как бы всунуть сюда проверку заданной директории на существование.
После каждого присвоения переменной пути каталога, т.е после
Windows Batch file
1
set "d1=C:\TEST"
добавляем строку:
Windows Batch file
1
if not exist "%d1%\" (echo Отсутствует указанный каталог %d1%&&pause&&exit)
естественно, для каждого каталога, требуется изменить имя переменной на соответствующее...

Цитата Сообщение от John Doe Посмотреть сообщение
не совсем понял, почему переменной %%a нужна именно 3-я подстрока tokens.
всё можно проверить, если запустить команду отдельно:
Windows Batch file
1
dir /s/-c/a-d "%temp%" |findstr /rc:"^[^ ]"
findstr здесь убирает строки, которые начинаются с пробела, а пустые строки убирает сам цикл for - итого, в сухом остатке, у нас будут только строки с нужной информацией. Вот теперь смотрим третью подстроку и видим там размер файла - остается только их сложить и тогда получим общий размер...

Цитата Сообщение от John Doe Посмотреть сообщение
Пробовал реализовать вывод информации об удалении на экран без лог файла. Вывод информации об удалённом файле дублируется. А каталог выводится и как удалённый каталог и как файл с тем же путём каталога.
А это уже смотря что убирать и как... для цикла нет разницы, каталог это или файл, он оперирует с тем, что записано в переменной...
1
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
25.06.2016, 16:10  [ТС]
Спасибо за разъяснения! Теперь, вроде, всё предельно ясно)
Что касается проверки заданных каталогов. Ваш вариант рассматривался. Проблема в том, что если хотя бы 1 или 2 директории не существует, а 3-ей нужна очистка, очистки не будет, т.к. при ложности 1 или 2 (или 1 и 2) батник завершается.
А в цикле прописаны все 3 директории. И если его запускать при несуществующих папках, может повториться то, чего я опасаюсь.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
25.06.2016, 16:22
John Doe,
Если хотите жестко перестраховаться, то можно делать так:
Windows Batch file
1
2
if exist "dir" cd /d "dir"
команды
или
Windows Batch file
1
2
3
4
5
if exist "dir" (
 pushd "dir"
  команды
 popd
)
будете уверены что удаляете что-то в нужной папке и естественно она есть, так как в ней находимся.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
25.06.2016, 19:09
Лучший ответ Сообщение было отмечено John Doe как решение

Решение

Цитата Сообщение от John Doe Посмотреть сообщение
Что касается проверки заданных каталогов. Ваш вариант рассматривался. Проблема в том, что если хотя бы 1 или 2 директории не существует, а 3-ей нужна очистка, очистки не будет, т.к. при ложности 1 или 2 (или 1 и 2) батник завершается.
А в цикле прописаны все 3 директории.
Ну, в принципе, можно сделать "ход конем"
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
rem Перечень каталогов для очистки:
set "d1=C:\TEST"
set "d2=C:\TEST2"
set "d3=%appdata%\Local\TEST"
set "d4="
rem Переменные счетчиков:
rem количество используемых каталогов
set n=3
rem инициализация счетчика переменных
set vn=0
for /l %%g in (1,1,%n%) do (
    if defined d%%g (
        call :dper %%g
    )
)
rem Готовый список с каталогами для добавления в команду dir
echo %dext%
goto continue
:dper
set vn=%1
call set "var=%%d%vn%%%"
if not exist "%var%\" exit /b
set "dext=%dext% "%var%""
exit /b
:continue
...
- это готовый код для врезки, только выход команды echo с готовым результатом можно удалить, здесь список директорий будет актуальным, причем в одной переменной, которую уже добавляем в нужные циклы...
Этот код можно запустить отдельно, для проверки того, что получим на выходе...
1
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
27.06.2016, 17:19  [ТС]
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
rem Задаём каталоги для очистки
set "d1=C:\TEST"
set "d2=C:\TEST2"
set "d3=%localappdata%\TEST"
rem Переменные счетчиков:
rem количество используемых каталогов
set n=3
rem инициализация счетчика переменных
set vn=0
rem Здесь задаётся последовательность чисел. И т.к. папки на данный момент три, то начало будет на первой директории
rem и так с шагом, равным одному, до 3. "if defined d%%g" - как я понял тут идёт подстановка переменной %%g к букве d
rem с целью определить истинность существования заданного каталога. Если d1...d3 истинны, для каждой вызывается :dper.
for /l %%g in (1,1,%n%) do (
    if defined d%%g (
        call :dper %%g
    )
)
rem Готовый список с каталогами для добавления в команду dir (с этим комментом вроде ясно)
echo %dext%
goto continue
:dper
rem Как я понял, vn принимает значение %%g
set vn=%1
rem Эту строку я не совсем понял. А именно, зачем здесь команда вызова call. %%d%vn%%% - в завимимости 
rem от значения %vn%, оно подставляется к букве d, в результате получаем директорию от d1 до d3 в %var%.
call set "var=%%d%vn%%%"
rem Если директория не существует, завершаем операцию :dper
if not exist "%var%" exit /b
rem Тут не понял, что есть %dext%?  в общем я эту строчку так же, не совсем догнал.
set "dext=%dext% "%var%""
exit /b
:continue
...
Исправьте меня пожалуйста, если я где-то неправильно закомментил или неправильно понял.
И объясните те моменты которые не догнал. Хочу понять всю структуру и каждые строчки кода для "общего своего" развития.
Как я понял, в цикл очистки подставляется %dext%?
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
27.06.2016, 22:19
Лучший ответ Сообщение было отмечено John Doe как решение

Решение

Цитата Сообщение от John Doe Посмотреть сообщение
А именно, зачем здесь команда вызова call. %%d%vn%%% - в завимимости
rem от значения %vn%, оно подставляется к букве d, в результате получаем директорию от d1 до d3 в %var%.
По сути: блок :dper ... exit /b - это подпрограмма, которая выполняется по вызову call :dper.
А именно call, в этой строке:
Windows Batch file
1
call set "var=%%d%vn%%%"
позволяет использовать двойное раскрытие переменной, т.е. в итоге мы присваиваем в переменную var значение переменных d1, d2, d3 ... dn по очереди, в зависимости от прохода с соответствующим значением %%g. Можно, конечно, получить это значение немного иначе, используя отложенное раскрытие переменных и представляя необходимое значение соответствующей переменной вот так: !d%vn%!, но это уже как кому нравится... В общем это сделано для возможности использования нумерованной переменной с автоматическим выбором определенного номера...

Цитата Сообщение от John Doe Посмотреть сообщение
rem Тут не понял, что есть %dext%? *в общем я эту строчку так же, не совсем догнал.
Windows Batch file
1
set "dext=%dext% "%var%""
Это присвоение нового значения переменной dext, со старым её значением и через пробел добавленным значением переменной var...
Для простоты понимания, можно это представить так:
Windows Batch file
1
2
3
4
5
6
@echo off
set dext=abc
echo dext="%dext%"
set dext=%dext% def
echo dext="%dext%"
pause
Добавлено через 5 минут
Цитата Сообщение от John Doe Посмотреть сообщение
Как я понял, в цикл очистки подставляется %dext%?
Да, надо удалить echo %dext% (команда при выходе из цикла) и далее, после :continue можно уже использовать готовый набор в виде переменной с проверенным списком каталогов, вместо ручного перечисления каталогов в цикле очистки и подсчета, в которых нет проверки на существование...
1
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
28.06.2016, 01:15  [ТС]
Ну про подпрограмму с меткой :dper я врубил. Маленькая программа в программе. И вызывается для каждого числа от 1 до 3.
Только всё равно не понимаю почему
Windows Batch file
1
call set "var=%%d%vn%%%"
вместо
Windows Batch file
1
set "var=%%d%vn%%%"
Ведь по сути %vn% итак берёт значение из %%g. А может я всё понимаю не совсем так. Или через call мы как бы вызываем значение из d%%g в %%d%vn%%% и заодно присваиваем его к %var%?!

Цитата Сообщение от YuS_2 Посмотреть сообщение
Это присвоение нового значения переменной dext, со старым её значением и через пробел добавленным значением переменной var...
Для простоты понимания, можно это представить так:
Windows Batch file
1
2
3
4
5
6
@echo off
set dext=abc
echo dext="%dext%"
set dext=%dext% def
echo dext="%dext%"
pause
Да я понял, что dext присваивается значение "%dext% "%var%"".
Просто если dext присваивает себе новое значение, где же старое? и откуда взялось %dext%, какое у него старое значение, если ранее dext нигде не фигурировало. В приведённом примере есть переменная "dext" со значением "abc". Тут всё предельно ясно. А в вашем коде врезки dext нигде не фигурировал до того момента, пока ему не присвоили "%dext% "%var%"" с неведомым старым значением.
Потому я и не могу догнать.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
28.06.2016, 02:51
John Doe,
все не так сложно
ведь команда
Windows Batch file
1
if not exist papka md papka
не вызывает у вас проблем, если нет папки создать ее
чего тогда проблема если нет переменной присвоить значение когда таковое соблаговолит появиться
это приблизительное объяснение, но доходчивое.

Добавлено через 2 минуты
а без помощи call не раскрыть или не присвоить переменную в переменной (съест обрамляющие %%), в справке это есть.
0
 Аватар для John Doe
0 / 0 / 0
Регистрация: 15.06.2016
Сообщений: 11
28.06.2016, 03:21  [ТС]
Т.е. изначально dext=%dext% "%var%"
где %dext% пока ещё не имеет значения, дальше: пробел и d1. И теперь dext имеет значение " "%d1%""
Далее к нему прибавляется новое значение из %var%. Т.е. "пробел%d2". И того dext равен уже " "%d1%" %d2%"" и т.д.
По идее дошло. Если я правильно всё понимаю.
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
28.06.2016, 05:40
Лучший ответ Сообщение было отмечено John Doe как решение

Решение

Цитата Сообщение от John Doe Посмотреть сообщение
Ведь по сути %vn% итак берёт значение из %%g. А может я всё понимаю не совсем так. Или через call мы как бы вызываем значение из d%%g в %%d%vn%%% и заодно присваиваем его к %var%?!
call, в данном случае, дает нам двойное раскрытие переменной, т.е. при первом проходе этой строки из %%d%vn%%% получаем %d1%, а при втором уже раскрывается именно нумерованная переменная. Если не будет call, то мы получим %d1% и всё на том, дальнейшего раскрытия не будет.

По остальному, вроде Вы разобрались.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2016, 05:40
Помогаю со студенческими работами здесь

Очистка папки от файлов
Появились на предприятии проблемы с принтером, вечно забитый спул. Всякое пробывал, решил что лучше всего работает удаления файлов с...

Проверка наличие папки на сервере
Привет. Работаю с IdFTP. Нужно проверить наличие папки на сервере с помощью этого компонента. Вопрос: Как это сделать?

Проверка на наличие папки и запуск
Ребята помогите написать батник, надо чтобы он после загрузки системы, проверял наличие на диске определенной папки, по пути...

Проверка на наличие папки и файла
Люди помогите с проверкой вот так ни работает: if then ... fi пишет: -e: не найдена команда А если так: if

Очистка и сравнение 2-х файлов с выводом несовпадающих в 3-й (соединить BAT и VBS в одном)
Здравствуйте! Есть 2 скрипта: VBS и BAT. Нужно их соединить в один VBS. VBS из этой темы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru