Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
T1MOXA
0 / 0 / 0
Регистрация: 08.01.2016
Сообщений: 4
1

Циклическая проверка наличия папок на дисках

21.11.2016, 15:23. Просмотров 856. Ответов 4
Метки нет (Все метки)

Нужно реализовать циклическую проверку двух папок на дисках, но я так и не смог сделать так чтоб это все заработало.
Где у меня ошибка?)
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
:Start
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist "%%i:\TEST_DIR"(
        echo [OK] Папка TEST_DIR найдена!
        set Test_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR!
        call :Pause 1000
        Goto Start
    )
    
    if exist "%%i:\TEST_DIR_2"(
        echo [OK] Папка TEST_DIR_2 найдена!
        set Test_2_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR_2!
        call :Pause 1000
        Goto Start
    )
)
 
:Pause
ping -n 1 -w %1 192.168.254.254>NUL
Добавлено через 7 часов 32 минуты
В общем я разобрался!
Проблема была в пропущенных пробелах после параметра if exist.

Правильно сделать так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
:Start
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist "%%i:\TEST_DIR"(
        echo [OK] Папка TEST_DIR найдена!
        set Test_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR!
        TIMEOUT /T 1 /NOBREAK 
        Goto Start
    )
    
    if exist "%%i:\TEST_DIR_2"(
        echo [OK] Папка TEST_DIR_2 найдена!
        set Test_2_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR_2!
        TIMEOUT /T 1 /NOBREAK 
        Goto Start
    )
)
Так-же я переделал код, сократив его таким образом.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist "%%i:\TEST_DIR" (
        echo [OK] Папка TEST_DIR найдена!
        set Test_Dir_Letter=%%i
    ) else if exist "%%i:\TEST_DIR_2" (
        echo [OK] Папка TEST_DIR_2 найдена!
        set Test_2_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR_2!
        TIMEOUT /T 1 /NOBREAK 
        Goto Start
    )
)
Добавлено через 9 минут
Хотя нет, это сокращение дает не верный результат!

Короче если кому нужно окончательная версия:
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
@echo off
chcp 866 >nul
 
:Start
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist "%%i:\TEST_DIR" (
        echo [OK] Папка TEST_DIR найдена!
        set Test_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR!
        ping -n 1 -w 1000 192.168.254.254>NUL
        Goto Start
    )
    
    if exist "%%i:\TEST_DIR" (
        echo [OK] Папка TEST_DIR_2 найдена!
        set Test_2_Dir_Letter=%%i
    ) else (
        echo [Error] Не удалось найти путь к папке TEST_DIR_2!
        ping -n 1 -w 1000 192.168.254.254>NUL
        Goto Start
    )
)
Добавлено через 1 час 21 минуту
Хотя нет...
Если папки нет, то все работает верно, но если путь находит - происходит странное.
Вместо того чтоб продолжать выполнение кода дальше, идеи цикл.

OK 1
OK 2
Ожидание 1
OK 1
OK 2
Ожидание 1
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
@echo off
chcp 866 >nul
 
:Cycle
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if not exist "%%i:\Users" (
        echo Ожидание 1
        ping -n 1 -w 1000 192.168.254.254>NUL
        goto Cycle
    ) else (
        echo OK 1
    )
    if not exist "%%i:\Users" (
        echo Ожидание 2
        ping -n 1 -w 1000 192.168.254.254>NUL
        goto Cycle
    ) else (
        echo OK 2
    )
)
 
echo OK+
pause
Что у меня не так?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2016, 15:23
Ответы с готовыми решениями:

Циклическая проверка наличия запущенного процесса и его закрытие в случае обнаружения
Напишите пожалуйста батник который при запуске начинает бесконечно примерно каждые 5 мин. проверять...

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

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

Копирование файлов из папок в разных пользовательских профилях в папки на разных дисках
Здравствуйте, нужна очень ваша помощь. У меня есть BAT файлик вот с такой командой пример. xcopy...

Циклическая проверка существования папки
Добрый день! Подскажите, пожалуйста: есть такой батник: xcopy "C:\1\template"...

4
greg zakharov
Покинул форум
2216 / 885 / 248
Регистрация: 07.05.2015
Сообщений: 1,781
21.11.2016, 16:03 2
T1MOXA, вопрос в том, что Вы вообще циклом желаете достичь: просто найти папку в корне диска? Если так, то Вам нужно избавиться от метки Cycle, а также переходов на данную метку дабы все зароботало.
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
@echo off
  setlocal enabledelayedexpansion
    for /l %%i in (65, 1, 90) do (
      cmd /c exit /b %%i
      set "map=!map!!=exitcodeascii!;"
    )
    set "map=!map:~,-1!"
    for %%i in ("!map:;=";"!") do (
      if exist "%%~i:\Users" (
        echo:Found on %%~i:\ drive.
      ) else (
        echo:Specified folder does not exist on %%~i:\ drive.
        call:sleep 3
      )
    )
  endlocal
exit /b
 
:sleep
  set /a "s=%~1/2+1"
  w32tm /stripchart /computer:localhost /period:1^
    /dataonly /samples:!s!>nul
exit /b
0
T1MOXA
0 / 0 / 0
Регистрация: 08.01.2016
Сообщений: 4
22.11.2016, 14:40  [ТС] 3
Мне нужно сделать следующее:
После запуска скрипта, он должен проверять наличие папки до тех пор пока не найдёт, и когда найдет - выполнить действие (например echo) и пойти дальше по коду.

Добавлено через 21 час 24 минуты
В общем я смог сделать так чтоб все работало как нужно.
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
:Cycle
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if not exist "%%i:\Users" (
        echo Ожидание 1
        ping -n 1 -w 1000 192.168.254.254>NUL
        goto Cycle
    ) else (
        echo OK 1
    )
    if not exist "%%i:\Users" (
        echo Ожидание 2
        ping -n 1 -w 1000 192.168.254.254>NUL
        goto Cycle
    ) else (
        echo OK 2
        goto Next
    )
)
 
:Next
echo OK+
pause
Но мне всё ещё не понятно почему так.
Разве если результат if exist - exist
То выполнение не должно идти дальше по коду?
Или я туплю ?

Добавлено через 50 минут
Нет, это тоже не верный вариант...
данный скрипт будет искать только на диске С, и если не находит, идет искать снова на нем!

Я короче хз как сделать верно

Помогите мне пожалуйста сделать следующее:
1. Скрипт ищет директории на всех дисках без задержек...
2. Если ни на одном из дисков нет нужных директорий, делать задержку в N секунд и повторять поиск...
3. Если же директория 1 и 2 найдены - выполнять echo 1 - OK, и echo 2 - OK...
4. Если же хоть одна из директорий все ещё не найдены начинать поиск с самого начала (с 1 пункта).
0
YuS_2
Любознательный
1087 / 622 / 193
Регистрация: 10.03.2016
Сообщений: 1,445
22.11.2016, 15:24 4
Лучший ответ Сообщение было отмечено T1MOXA как решение

Решение

Цитата Сообщение от T1MOXA Посмотреть сообщение
Помогите мне пожалуйста сделать следующее:
1. Скрипт ищет директории на всех дисках без задержек...
2. Если ни на одном из дисков нет нужных директорий, делать задержку в N секунд и повторять поиск...
3. Если же директория 1 и 2 найдены - выполнять echo 1 - OK, и echo 2 - OK...
4. Если же хоть одна из директорий все ещё не найдены начинать поиск с самого начала (с 1 пункта).
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
@echo off
set N=5
set "d1=:\DIR1"
set "d2=:\DIR2"
:begin
set "f1="
set "f2="
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if exist "%%i%d1%" (set f1=1)
    if exist "%%i%d2%" (set f2=1)
)
if defined f1 (
    if defined f2 (
        echo OK1&echo OK2&goto next
    ) else (
        timeout /t %N% &goto begin
    )
) else (
    timeout /t %N% &goto begin
)
:next
echo OK+
pause&exit /b
1
T1MOXA
0 / 0 / 0
Регистрация: 08.01.2016
Сообщений: 4
23.11.2016, 08:31  [ТС] 5
Спасибо огромное, это то что нужно!
0
23.11.2016, 08:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 08:31

Выполнить заданные команды в зависимости от результата проверки наличия папок или файлов в заданной директории
Здравствуйте! Задача 1. Необходимо проверить наличие папок либо файлов в директории D:\temp....

Проверка наличия диска
Подключаю в батнике сетевой диск net use x: \\VasyaServer\Share /user:VASYADOMAIN\VASYA 12345, но...

Проверка наличия интернета
Привет всем! Столкнулся с проблемой проверки наличия подключения интернета через команду FIND ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru