Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 10

Модерирует : KLASS, IFkO

vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

   

vu1tur



Moderator-Saaber
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задачи на bat-файлах 10
(часть 1, часть 2, часть 3, часть 4, часть 5, часть 6, часть 7, часть 8, часть 9)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Делаем паузу в командном файле стандартными средствами Windows
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:53 09-01-2011 | Исправлено: mazafakermazafaka, 11:22 04-06-2011
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Jay90

    Цитата:
    хм почему то не видит путь из переменной outdir... Пишет: Системе не удается найти указанный путь. кладу в 123456.txt путь до базы:  

    Честно признаться, я нифига не понял что ты хочешь получить!
    Если хочешь чтоб путь лежал в каком-то файле,а потом из него доставть и присвоить переменной, то это так:
    for /f "delims=" %%a in (123456.txt) do set "outdir=%%a"
    путь лежит в файле 123456.txt, сам файл лежит в текущем каталоге.
     
    Может просто задашь жестко путь для базы в переменную и будешь ею в батнике пользоваться.
     
    Добавлено:

    Цитата:
    1>%outdir%123456.txt
    echo %Path2%  

    вот это надо писать в одну строку, так как было в моем примере.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 15:24 08-04-2011
    Jay90

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    есть база данных, заношу путь до нее в Path2.
    есть файл настроек, туда надо занести путь до базы из переменной Path2.
    этот файл настроек 123456.txt - он неизвестно где лежит так как пользователь может поставить инсталятор программы куда угодно - поэтому ищу путь до него.
    найдя путь до него я в него - в 123456.txt заношу путь до базы Path2.
     

    Код:
    @echo off
    SETLOCAL EnableDelayedExpansion
    rem ищу путь до базы, успешно нахожу
    for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\1.fdb  D:\1.fdb') Do Set "Path2=!Path2!;%%~dpa"  
    Set "Path2=%Path2:~1%  
    echo %Path2%
     
    rem ищу путь до файла настроек, вроде как по аналогии все
    for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\123456.txt D:\123456.txt') Do Set "outdir=!outdir!;%%~dpa"  
    Set "outdir=%outdir:~1%  
    echo %outdir%
     
    rem и самое интересное - в файл настроек копирую путь до базы - почему то не пашет
    1>%outdir%123456.txt echo %Path2%  

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

    Всего записей: 9 | Зарегистр. 08-04-2011 | Отправлено: 15:40 08-04-2011 | Исправлено: Jay90, 16:17 08-04-2011
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Jay90
    Сформулируй своими словами что надо, без употребления терминов типа переменная.
     
     
    Добавлено:
    1>"%outdir%123456.txt" echo %Path2%

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 20:44 08-04-2011
    Fromrussia

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно как-то выполнить задачу, которую я описал здесь http://forum.ru-board.com/topic.cgi?forum=8&topic=40818#1 Хотя бы скелет батника.

    Всего записей: 132 | Зарегистр. 09-04-2011 | Отправлено: 20:13 09-04-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fromrussia
    Попробуй:

    Код:
     
    @echo off
     
    for %%i in (jpg ogg avi) do (
     
        for /f "tokens=*" %%j in (' dir /b /s /a "C:\*.%%i" ') do (
     
            2>nul md "D:%%~pj"
            move "%%j" "D:%%~pj"  
     
        )
     
    )  
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 20:59 09-04-2011
    Fromrussia

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    Если я заменю move на copy ничего не изменится? Все-таки живые люди, надо потестить скрипт

    Всего записей: 132 | Зарегистр. 09-04-2011 | Отправлено: 21:23 09-04-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fromrussia
    Тогда просто скопируешь. Просто создай тестовую папку с несколькими подпапками разной глубины, и насоздавай пустых файлов разных расширений, подправь пути и протестируй:

    Код:
     
    ....
        for /f "tokens=*" %%j in (' dir /b /s /a "C:\Some\Test\Folder\*.%%i" ') do (
    ....
     

    Или просто сделай echo-вывод и посмотри результаты:

    Код:
     
    @echo off
     
    for %%i in (jpg ogg avi) do (
     
        for /f "tokens=*" %%j in (' dir /b /s /a "C:\*.%%i" ') do (
     
            echo md "D:%%~pj"
            echo move "%%j" "D:%%~pj"  
     
        )
     
    )  
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 21:41 09-04-2011
    Fromrussia

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    Правильно ли я понимаю логику и синтаксис?

    Код:
    @echo off  
     
    for %%i in (jpg ogg avi) do (  
     
        for /f "tokens=*" %%j in (' dir /b /s /a "<полный_путь_к_папке>\*.%%i" ') do (  
     
             rem 2>nul md "D:%%~pj"
             2>nul "\\server\folder\%%~pj"
             copy "%%j" "\\server\folder\%%~pj"  
     
        )  
     
    )

     
    Опционально, можно ли объяснить шаги, выполняемые данным скриптом? Я в % и ~ полный nul

    Всего записей: 132 | Зарегистр. 09-04-2011 | Отправлено: 22:26 09-04-2011 | Исправлено: Fromrussia, 22:32 09-04-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fromrussia
    Нет. Создай тестовое дерево с файлами, например:

    Код:
     
    @echo off
     
    md "c:\test\test 1\test 11\test 111";"c:\test\test 2\test 22\test 222"
     
    for %%i in (txt jpg avi ogg mp3 bmp doc docx exe) do (
         
        for /r c:\test /d %%j in (*) do cd.>"%%j\test.%%i"
     
    )
     

    И протестируй батник:

    Код:
     
    @echo off
     
    for %%i in (jpg ogg avi) do (
     
        for /f "tokens=*" %%j in (' dir /b /s /a "C:\test\*.%%i" ') do (
     
            2>nul md "D:%%~pj"
            move "%%j" "D:%%~pj"  
     
        )
     
    )
     

    Файлы с расширенем *.jpg *.ogg и *.avi должны переместиться на диск d:, сохраняя пути.


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:56 09-04-2011 | Исправлено: 01MDM, 22:58 09-04-2011
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Посоветуйте надёжную утилиту для паузы на несколько часов. Sleep почему то вместо паузы на 20400 секунд ждала 23000 секунд.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 09:03 10-04-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Попробуй:

    Код:
     
    nircmdc wait 2040000
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 09:35 10-04-2011
    Free_Soft



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    в Win7 Timeout /?

    ----------
    На вашей перфокартѣ обнаруженъ вирусъ, механизмъ будетъ остановленъ.

    Всего записей: 1536 | Зарегистр. 19-04-2010 | Отправлено: 12:40 10-04-2011
    Misha1989



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    Цитата:
    nircmdc wait 2040000

    Не, там 1000 миллисекунд. Поэтому так:

    Код:
    nircmdc wait 20400000

    Всего записей: 359 | Зарегистр. 22-03-2010 | Отправлено: 13:20 10-04-2011
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Посоветуйте надёжную утилиту для паузы на несколько часов.
    а нафига такую паузу отрабатывать одной утилитой? тривиальный пинг на минуту в сумме с циклом-счетчиком дают паузу произвольной длительности и, при желании, прогресс в шапке окна - чтоб в случае чего видеть сколько ждать.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 23:22 10-04-2011
    Free_Soft



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Туплю:
    имеется папка, в которой должен быть единственный файл с известным расширением и произвольным именем (напр., *.jpg).
    Как инициировать ошибку, если в папке появится другой файл с таким же расширением?

    ----------
    На вашей перфокартѣ обнаруженъ вирусъ, механизмъ будетъ остановленъ.

    Всего записей: 1536 | Зарегистр. 19-04-2010 | Отправлено: 09:10 11-04-2011
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven

    Цитата:
    Посоветуйте надёжную утилиту для паузы на несколько часов.

    Лучше добавить одноразовое задание в шедулер, запускаемое через несколько часов.
    Хотя возникнет сложность с вычислением времени запуска задания.
     
    Free_Soft

    Цитата:
    Как инициировать ошибку, если в папке появится другой файл с таким же расширением?
     

    Так можно:

    Код:
    @echo off
    ::Запоминаем имя и расширение файла:
    for /f %%a in ('dir /b /a:-d *.jpg 2^>nul') do set "fname=%%a" & set "ext=%%~xa"
     
    ::Проверяем на наличие других файлов с тем же расширением.
    for /f %%a in ('dir /b /a:-d *%ext% 2^>nul ^| findstr /v "%fname%" ') do echo.Ошибка & exit
     


    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 10:32 11-04-2011 | Исправлено: res2001, 10:38 11-04-2011
    ipmanyak



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Free_Soft Думаю, что только подсчетом количества файлов. Типа
    for /f "tokens=*" %%i in ('dir /b /s /a:-d "%1\*.*"') do set /a count_f+=1
    echo %count_f% "files"
    if %count_f% neq 1 echo error
    pause
                                                                       
     


    ----------
    В сортире лучше быть юзером, чем админом...

    Всего записей: 11724 | Зарегистр. 10-12-2003 | Отправлено: 10:57 11-04-2011 | Исправлено: ipmanyak, 11:04 11-04-2011
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Free_Soft
    Цитата:
     
    Как инициировать ошибку, если в папке появится другой файл с таким же расширением?

     

    Цитата:
    Думаю, что только подсчетом количества файлов.
    ага, но пример невредно упростить:
     
    for /f "skip=1" %%i in ('dir /b /a-d *.jpg') do goto :error_not_only
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 12:40 11-04-2011 | Исправлено: wolf0425, 12:43 11-04-2011
    bredonosec



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вопрос, как передать аутлуку параметры настройки?  
    В смысле, первый запуск, он просит тип сервера (эксчейндж), адрес серва, имя акка - как это ему передать батником?  
     
    Второй вопрос, как в комстроке выяснить, принадлежит ли юзер. под которым сейчас батник работает, к группе админов, или просто юзеров, чтоб в зависимости от этого запускать или не запускать блок
    ?

    ----------
    Вопрос: 'Что человек курит?' как правило возникает не когда ты слышишь, как он дышит, а когда видишь, что он пишет
    Пропеллер играет роль вентилятора, он останавливается -пилот потеет
    Аськи нету.

    Всего записей: 16257 | Зарегистр. 13-02-2003 | Отправлено: 13:04 11-04-2011
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    bredonosec

    Цитата:
    вопрос, как передать аутлуку параметры настройки?  

    На сколько помню отулук хранит свои учетные записи тут:
    HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\
     
    Добавлено:
    bredonosec

    Цитата:
    Второй вопрос, как в комстроке выяснить, принадлежит ли юзер. под которым сейчас батник работает, к группе админов, или просто юзеров, чтоб в зависимости от этого запускать или не запускать блок
    ?

    Узнать принадлежность текущего юзера к группам можно так:
    wmic path Win32_GroupUser where (partcomponent="Win32_UserAccount.Domain=\"%USERDOMAIN%\",Name=\"%USERNAME%\"")

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 13:27 11-04-2011
       

    Страницы: 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 10
    vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru