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

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

Модерирует : gyra, Maz

Widok (19-11-2007 12:08): лимит страниц. продолжаем здесь  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 109 110 111 112 113 114 115 116 117 118

   

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Задачи на bat-файлах 4
 
Полезные ссылки:
· Cmd. Описание от разработчиков
· Урок bat-аники (для начинающих)
· Набор GNU утилит для win32
· Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· cmdow — изменение параметров и видимости дос-окна
· blat — отправка почты из консоли
· Справка по командам в виде Html
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Пример - получение и обработка списка пользователей
 
 
Старая версия первого сообщения

Всего записей: 9736 | Зарегистр. 12-10-2001 | Отправлено: 04:28 24-09-2002 | Исправлено: Elroir, 19:35 11-09-2007
freeminded

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

Цитата:
 
Реально:  
 
Код:  

Цитата:
@echo off    
setlocal    
for %%a in (*.*) do call :renfile "%%a"    
goto :EOF    
:renfile  
for /f "tokens=1,2* delims=[]" %%b in (%1) do set "file=%%b%%d"  
set "file=%file:  = %"  
set "file=%file: =_%"    
if not "%file%"=="%~1" ren "%~1" "%file%"  

 

 
чудесно работает! спасибо. еще бы разобратся как он (код) исполняет нужное.
 
цикл - 2 шт. первый исполняет все что в метке :renfile, в конце :EOF.
в свою очередь, :renfile имеет свой цикл, который и переименовывает все.
 
а что делается в циклах - это неописуемо...
 
set "file=%file:  = %"  - это типа переменной типа файл присваевается = %"
 
ужас! мне никогда не разобратся в этом!
 
Еще раз спасибо за код батничка!

Всего записей: 14 | Зарегистр. 02-06-2007 | Отправлено: 08:39 02-11-2007
root1976

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть файл вида 1111_???.222
Его нужно переименовать в  
00_???w.222
где ??? - число которое менять не нужно, оно должно остаться.
Заранее спасибо!
 
Добавлено:
Большое спасибо....... мне уже помогли!!!!!!
Моя благодарность не знает граниЦ!

Всего записей: 3 | Зарегистр. 02-11-2007 | Отправлено: 09:47 02-11-2007
Elroir



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

Цитата:
еще бы разобратся как он (код) исполняет нужное

Давай разбираться :
Первый цикл for идет по всем файлам в текущей директории и для каждого вызывает виртуальный батник :renfile, передавая ему в качестве аргумента имя этого файла.
Внутри :renfile - цикл for в первой строке позволяет разделить переданное имя файла на 3 части - до символа "[", после "[" и до "]", после символа "]". Первая и третья части соединяются и записываются в переменную file ( set "file=%%b%%d" ).
Так как до "[" и после "]" в оригинальном названии были пробелы, в новом названии ( в переменной), в месте соединения частей у нас оказались два пробела подряд. Чтобы от них избавиться, обрабатываем переменную file - запускаем следующую команду set "file=%file:  = %", то есть заменяем любые два пробела идущие один за другим (два пробела до знака "=") на один пробел (после знака "="). Теперь займемся заменой пробелов на знаки подчеркиванья - set "file=%file: =_%", используется та же конструкция, заменяем " " на "_". После этого в переменной файл у нас то название, которое нам и было нужно.
На всякий случай проверяем отличается ли название в переменной от оригинального названия (мало ли - может там и не было пробелов и квадратных скобок) и если отличается - переименовываем файл.      

----------
"В интернете есть все, но не всегда"

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:36 03-11-2007
freeminded

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

Цитата:
Давай разбираться  :  
Первый цикл for идет по всем файлам в текущей директории и для каждого вызывает виртуальный батник :renfile, передавая ему в качестве аргумента имя этого файла.  
Внутри :renfile - цикл for в первой строке позволяет разделить переданное имя файла на 3 части - до символа "[", после "[" и до "]", после символа "]". Первая и третья части соединяются и записываются в переменную file ( set "file=%%b%%d" ).  
Так как до "[" и после "]" в оригинальном названии были пробелы, в новом названии ( в переменной), в месте соединения частей у нас оказались два пробела подряд. Чтобы от них избавиться, обрабатываем переменную file - запускаем следующую команду set "file=%file:  = %", то есть заменяем любые два пробела идущие один за другим (два пробела до знака "=") на один пробел (после знака "="). Теперь займемся заменой пробелов на знаки подчеркиванья - set "file=%file: =_%", используется та же конструкция, заменяем " " на "_". После этого в переменной файл у нас то название, которое нам и было нужно.  
На всякий случай проверяем отличается ли название в переменной от оригинального названия (мало ли - может там и не было пробелов и квадратных скобок) и если отличается - переименовываем файл.
 

... да... черт ногу сломит....

Всего записей: 14 | Зарегистр. 02-06-2007 | Отправлено: 09:44 05-11-2007
Aldares



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите определить доступность диска .
есть в батнике команда  
for /D %%d 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 %%d:\autorun.inf.tmp attrib -s -h -r %%d:\autorun.* & del %%d:\autorun.*
Если диска с такой буквой просто нет, то все нормально .
Если в машинке стоит кардридер - есть несколько съемных дисков, которые недоступны, пока не сунешь в них карточку, при обращении к ним винда вываливает окошко "диск недоступен ок/отмена/повторить" . Соответственно, если нужно обратиться к каждому из дисков раз по 10, приходится нажимать давить кнопку "отмена" ~50 раз .
Я предполагаю сделать что-то типа for /D %%d 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 dir %%d: , проверить errorlevel и собрать новую строку из доступных дисков, но чего-то не получается - эррорлевел всегда или 1 или 0, хотя должен быть своим для каждой команды .
 
Нашел
Commands CLS, CD and DIR doesn't reset the current errorlevel, and other DOS commands returns their own errorlevels.
надо искать другой путь ..

Всего записей: 568 | Зарегистр. 09-11-2004 | Отправлено: 07:46 06-11-2007 | Исправлено: Aldares, 07:49 06-11-2007
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aldares
Сначала вопрос - зачем используется ключ /D в for-е?
Дальше - errorlevel=0 обычно означает завершение работы без ошибок, а errorlevel=1 - с ошибками. Errorlevel не должен быть своим для каждой команды. Если запускать команду dir с ключом /a-d, то dir установит errorlevel=1 если в тестируемой директории (в твоем случае в корне диска) нет ни одного файла.
Есть еще один способ проверки - "if exist d:\nul".

----------
"В интернете есть все, но не всегда"

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 09:50 06-11-2007
Grisha_Tamashi_SAN



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

Цитата:
 
@echo off    
@net view|@for /F "tokens=1" %%c in ('@find "\\"') do (    
@if not "%%c"=="\\SERV313"  (    
    ECHO %DATE:~-10% %TIME%  shuting down %%c
    echo shutdown /s /m %%c    
    echo.    
    ) >>shtdown_list.txt
)

Премного благодарен за ответ.

Всего записей: 44 | Зарегистр. 17-09-2002 | Отправлено: 18:14 06-11-2007
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grisha_Tamashi_SAN
Должно быть что-нибудь вроде такого:

Код:
 
@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('net view ^| find "\\" ^| findstr /v /g:no_shut.lst') do (
echo !date:~-10! !time!  shutting down %%a
echo shutdown -s -m %%a
)>>shtdown_list.txt
 

В файле no_shut.lst должны быть названия компьютеров, которые не надо выключать - по одному названию на строчке.

----------
"В интернете есть все, но не всегда"

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:44 06-11-2007
Panadol



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как сделать что бы окно доса не закрывалось сразу после завершения приложения???
Хочу увидеть результат работы, а окно очень быстро закрывается.
Вариант запустить cmd не устраивает - слишком долго в досе набирать строку с программой.
 
 
Добавлено:
Проблему решил - написал батник и в конце команда пауза

Всего записей: 31 | Зарегистр. 11-04-2006 | Отправлено: 00:26 07-11-2007
Aldares



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В цикле не хочет переменную дописывать :[
Делаю  

Код:
cls
for /D %%d 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 %%d:\nul do set zz=%zz%,%%d
echo %zz%
pause

Эхо ничего не выдает. Если предварительно zz что-то назначить, выдает "что-то,z"
Пробовал, как по писаному на процедуры скобками разбивать, тоже фиг .

Всего записей: 568 | Зарегистр. 09-11-2004 | Отправлено: 08:06 07-11-2007
01MDM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aldares
Не совсем понял, что надо

Код:
 
@echo off
set "zz=2 zet"
cls
for /D %%d 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 %%d:\nul set "zz=%zz%,%%d" && call:sub
)
goto:eof
:sub
echo %zz%
 

 

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 09:01 07-11-2007 | Исправлено: 01MDM, 09:13 07-11-2007
Grisha_Tamashi_SAN



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

Цитата:
Должно быть что-нибудь вроде такого:  
 

Хм, в лог попадают комп-ры исключения

Цитата:
07.11.2007 11:55  shutting down \\SERVER  
Command shutdown -s -m \\SERVER  

Значит исключения не происходит?                                                          

Всего записей: 44 | Зарегистр. 17-09-2002 | Отправлено: 12:06 07-11-2007
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grisha_Tamashi_SAN
1. У меня в коде небольшая ошибка - вместо "tokens=*", должно быть "tokens=1".
2. В файле no_shut.lst названия файлов, которые не нужно выключать, записаны?

----------
"В интернете есть все, но не всегда"

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 12:20 07-11-2007
Grisha_Tamashi_SAN



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

Цитата:
Elroir

Хм, результат тот же

Цитата:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1" %%a in ('net view ^| find "\\" ^| findstr /v /g:no_shut.lst') do (
echo !date:~-10! !time:~0,5!  shutting down %%a
echo Command shutdown -s -m %%a
)>>shtdown_list.txt
 

no_shut.lst

Цитата:
\\server
\\server4
\\server3

Пробовал без "\\" - результат тот же
Лог

Цитата:
07.11.2007 12:42  shutting down \\SALES
Command shutdown -s -m \\SALES
07.11.2007 12:42  shutting down \\SERVER
Command shutdown -s -m \\SERVER
07.11.2007 12:42  shutting down \\SERVER3
Command shutdown -s -m \\SERVER3
07.11.2007 12:42  shutting down \\SERVER4
Command shutdown -s -m \\SERVER4
07.11.2007 12:42  shutting down \\SERVERBK


Всего записей: 44 | Зарегистр. 17-09-2002 | Отправлено: 12:52 07-11-2007
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grisha_Tamashi_SAN
Дело в том, что server и SERVER - это две разные вещи.
Добавь ключ /i к findstr:

Код:
 
for /f "tokens=1" %%a in ('net view ^| find "\\" ^| findstr /i /v /g:no_shut.lst') do (  
 


----------
"В интернете есть все, но не всегда"

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 13:05 07-11-2007
Grisha_Tamashi_SAN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Elroir
ДА... то что дохтур прописал.
А где почитать по замене %TIME% на !TIME!?
Удачи. Спасибо за терпение.
 

Всего записей: 44 | Зарегистр. 17-09-2002 | Отправлено: 13:49 07-11-2007
Elroir



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

Цитата:
Delayed environment variable expansion allows you to use a different
character (the exclamation mark) to expand environment variables at
execution time.  If delayed variable expansion is enabled, the above
examples could be written as follows to work as intended:
 
    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )
 
    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%
 


----------
"В интернете есть все, но не всегда"

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:02 07-11-2007
kalkin5



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть 2 известные программы: iTunes & QuickTime, как-то решил проверить почему они занимают такой большой размер после инсталяции, оказалось, что они, по доброте душевной, инсталируют не только русский (к примеру) и английский, но и все другие языки... что не есть гуд имхо
отсуда вопрос:
как с помощью bat файла удалить лишние языки?
структура папок:
iTunes\iTunes.Resources
iTunes\iTunesHelper.Resources
iTunes\iTunesMiniPlayer.Resources
в каждой из этих папок есть подпаки, такие как:
en.lproj, ru.lproj
и всякие другие "ненужные" именно мне
da.lproj, de.lproj, es.lproj, fi.lproj, fr.lproj, it.lproj, ja.lproj, ko.lproj, nb.lproj, nl.lproj, sv.lproj, zh_CN.lproj, zh_TW.lproj
как их красиво "грохнуть" из всех трех папок сразу? при минимуме строк в bat файле?
как идея переместить нужные папки (с сохранением структуры) во временную, удалить эти три папки, а потом переместить "нужные" файлы в зад,
только как это все красиво написать? подскажите пож-та...

Всего записей: 186 | Зарегистр. 21-03-2006 | Отправлено: 14:24 07-11-2007
Maza Faka



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

Код:
 

@echo off
for /f "delims=" %%a in (
'dir c:\temp\iTunes /b /s /a ^| findstr /i "lproj\>" ^| find /i /v "ru." ^| find /i /v "en."') do rd /q /s %%a

 

Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 15:31 07-11-2007
Aldares



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
01MDM
 
Вот, что нужно .
 

Цитата:
Помогите определить доступность диска .  
есть в батнике команда  
for /D %%d 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 %%d:\autorun.inf.tmp attrib -s -h -r %%d:\autorun.* & del %%d:\autorun.*  
Если диска с такой буквой просто нет, то все нормально .  
Если в машинке стоит кардридер - есть несколько съемных дисков, которые недоступны, пока не сунешь в них карточку, при обращении к ним винда вываливает окошко "диск недоступен ок/отмена/повторить" . Соответственно, если нужно обратиться к каждому из дисков раз по 10, приходится нажимать давить кнопку "отмена" ~50 раз .  
Я предполагаю сделать что-то типа for /D %%d 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 dir %%d: , проверить errorlevel и собрать новую строку из доступных дисков, но чего-то не получается - эррорлевел всегда или 1 или 0, хотя должен быть своим для каждой команды .  
 
Нашел  
Commands CLS, CD and DIR doesn't reset the current errorlevel, and other DOS commands returns their own errorlevels.  
надо искать другой путь ..

Всего записей: 568 | Зарегистр. 09-11-2004 | Отправлено: 06:25 08-11-2007
   

Страницы: 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 109 110 111 112 113 114 115 116 117 118

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
Widok (19-11-2007 12:08): лимит страниц. продолжаем здесь


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru