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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

Maz



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

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору > Автоматизация администрирования
Microsoft Windows > Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
> Описание Cmd.exe > Command shell overview
> Using batch files > Using batch parameters > Using filters > Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Выполнение BAT-скриптов без вызова окна консоли
· cmdow - изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· blat - отправка почты из консоли
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)
 
· Архив всевозможных версий cmd.exe (от Windows NT 3.10 до Windows 11 +Win95cmd +ReactOS) и command.com (DOS 5.0 и выше). Старые командные процессоры можно запускать на более новых ОС, хотя не всё может работать корректно. Подробная документация по командам cmd.exe и стандартным утилитам ОС для NT 3.51, NT 5.0 (Windows 2000) и NT 5.2 (Windows Server 2003). Сборник представляет исторический интерес, а также незаменим для тех, у кого появилось желание сделать свои скрипты работоспобными не только на своей версии ОС.
 
· Большой сборник одним архивом: Сотни Win32 утилит командной строки, нетривиальные .cmd файлы, .bat miniperl скрипты (не требующие полноценной установки Perl), FAR Manager с плагинами и настройками, разное для DOS/DOSBox (откуда под Win32 интерес представляют три продвинутых "мультисистемных" .bat файла да ещё, может быть, оболочка Necromancer DOS Navigator с поддержкой LFN и доступом к буферу обмена Windows). Краткие описания всего - в файликах files.bbs

Всего записей: 39196 | Зарегистр. 26-02-2002 | Отправлено: 22:41 20-06-2024 | Исправлено: Maz, 21:52 28-09-2024
BorlandIMHO

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

Цитата:
powershell, к сожалению, не прокатит - скрипт использую в Windows XP

Пош под XP можно и поставить, штатно. https://www.catalog.update.microsoft.com/Search.aspx?q=powershell+2.0
Не то, чтобы другие решения принципиально невозможны - просто именно powershell решает поставленную задачу наиболее изящно и наименее геморройно...
Фильтрация большого списка расширений на предмет уникальности штатными средствами "голого" cmd - очень ресурсоёмкая задача...
 
GCRaistlin

Цитата:
с юникодом в XP ничего не поделаешь.

Данная проблема, с высокой вероятностью - надуманная. Возможность использования юникода в именах/расширениях файлов присутствует, конечно же. Но на практике, если не предпринимать специально на то направленных усилий, в расширениях файлов {"нечитабельного"} юникода не будет. Более того, с высокой долей вероятности там будут только символы с кодами до 127 (KOI-7, он же UTF-7). Расширения файлов, используемые бОльшей частью ПО - на "чистой" латинице.

Всего записей: 2845 | Зарегистр. 12-10-2006 | Отправлено: 15:39 03-01-2025
GCRaistlin



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

Цитата:
Данная проблема, с высокой вероятностью - надуманная.

Это уж автору ТЗ виднее. Я лишь предупредил.
 
Добавлено:

Цитата:
Фильтрация большого списка расширений на предмет уникальности штатными средствами "голого" cmd - очень ресурсоёмкая задача...

Голого cmd - да, а если использовать sort - то ничего особо ресурсоемкого.

----------
Magically yours
Raistlin

Всего записей: 4198 | Зарегистр. 18-04-2005 | Отправлено: 15:54 03-01-2025 | Исправлено: GCRaistlin, 15:59 03-01-2025
BorlandIMHO

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

Цитата:
а если использовать sort - то ничего особо ресурсоемкого.

Штатный sort - не умеет в "unique", если вы вдруг не знали. Даже в самом свежем 2025 сервере...  А если уж речь заходит про использование дополнительных инструментов - мне ближе всё-таки powershell.

Всего записей: 2845 | Зарегистр. 12-10-2006 | Отправлено: 16:24 03-01-2025
GCRaistlin



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

Цитата:
Штатный sort - не умеет в "unique"

Глагол "уметь" - переходный, требует дополнения в винительном падеже, не употребляется с предлогами.
 

Код:
 
@echo off
setlocal enableextensions disabledelayedexpansion
set StartDir=%1
set CurExt=:
if defined TmpFile2 set TmpFile2=
 
:TmpFile1
set "TmpFile1=%Temp%\%~n0%random%.txt"
if exist "%TmpFile1%" goto TmpFile1
>"%TmpFile1%" (for /r "%StartDir%" %%A in (*) do echo %%~xA) || goto Exit
 
:TmpFile2
set TmpFile2=%Temp%\%~n0%random%.txt
if exist "%TmpFile2%" goto TmpFile2
sort.exe "%TmpFile1%" /o "%TmpFile2%" || goto Exit
 
setlocal enabledelayedexpansion || goto Exit
echo Files in !StartDir:^"=! have the following extensions:
(for /f "usebackq delims=" %%A in ("!TmpFile2!") do (
  if _ neq _!! setlocal enabledelayedexpansion
  for /f "tokens=1* delims=|" %%B in (" |!CurExt!") do (
    endlocal
    if /i %%C neq %%~xA (
      set CurExt=%%~xA
      if _==_%%~xA (
        echo [no extension]
      ) else (
        echo %%~xA
      )
    )
  )
)) || (
  endlocal
  echo [no extension]
)
 
:Exit
if errorlevel 1 echo Error!
if exist "%TmpFile1%" del "%TmpFile1%"
if exist "%TmpFile2%" del "%TmpFile2%"
 


----------
Magically yours
Raistlin

Всего записей: 4198 | Зарегистр. 18-04-2005 | Отправлено: 16:40 03-01-2025 | Исправлено: GCRaistlin, 17:27 03-01-2025
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Примерно такой код я и имел ввиду, говоря о "очень ресурсоёмко". Нет, не в плане загрузки RAM/CPU "по самое некуда", но время выполнения на большом списке - удручает.  
Я даже когда-то нечто подобное использовал, почему и имею представление о затратах времени...
В отличие от штатного sort.exe, никсовый и повершельный умеют чистить дубли самостоятельно, прямо в потоке.
 
И в вашем коде, кстати, использован лишний временный файл: можно было сразу отдать команде sort вывод for "по трубе" и сохранять в файле уже сортированное.
 
P.S. А учить меня русскому языку не надо, пожалуйста!

Всего записей: 2845 | Зарегистр. 12-10-2006 | Отправлено: 18:08 03-01-2025
GCRaistlin



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

Цитата:
время выполнения на большом списке - удручает

23 секунды для 6099 файлов.
 

Цитата:
 в вашем коде, кстати, использован лишний временный файл: можно было сразу отдать команде sort вывод for "по трубе" и сохранять в файле уже сортированное

Вы определитесь: либо переживайте за скорость, либо используйте без надобности "трубу".
 

Цитата:
А учить меня русскому языку не надо, пожалуйста!

А не надо, обращаясь ко мне, над ним измываться.

----------
Magically yours
Raistlin

Всего записей: 4198 | Зарегистр. 18-04-2005 | Отправлено: 18:16 03-01-2025
Roman_Hayretdinov



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Цитата:
Примерно такой код я и имел ввиду, говоря о "очень ресурсоёмко"

Я был очень сильно удивлён, но папку с 277863 файлами и 24666 папками этот код обработал очень быстро: за 2 минуты 47 секунд. Ту же самую папку
Код:
WMIC DATAFILE WHERE "drive='%cd:~,2%' and path like '\\имя_папки\\%'" GET Extension

обрабатывал по-крайней мере больше получаса, а потом выдал ошибку (хотя с маленькими папками справляется бодро)

Цитата:
Пош под XP можно и поставить, штатно

Да, я знаю, просто не хочется .NET Фреймворк ставить ради него

Всего записей: 113 | Зарегистр. 19-12-2021 | Отправлено: 22:10 03-01-2025 | Исправлено: Roman_Hayretdinov, 22:17 03-01-2025
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Roman_Hayretdinov
Тот код пропустит файлы с атрибутами Hidden и System.
 

Код:
 
@echo off
rem v2025-01-03_2
setlocal enableextensions disabledelayedexpansion
set StartDir=%1
set CurExt=:
if defined TmpFile2 set TmpFile2=
 
:TmpFile1
set "TmpFile1=%Temp%\%~n0%random%.txt"
if exist "%TmpFile1%" goto TmpFile1
 
>"%TmpFile1%" dir /b /s /a-d "%StartDir%" || goto Exit
 
:TmpFile2
set TmpFile2=%Temp%\%~n0%random%.txt
if exist "%TmpFile2%" goto TmpFile2
 
>"%TmpFile2%" (for /f "usebackq delims=" %%A in ("%TmpFile1%") do echo %%~xA) || goto Exit
sort.exe "%TmpFile2%" /o "%TmpFile1%" || goto Exit
 
setlocal enabledelayedexpansion || goto Exit
echo Files in !StartDir:^"=! have the following extensions:
(for /f "usebackq delims=" %%A in ("!TmpFile1!") do (
  if _ neq _!! setlocal enabledelayedexpansion
  for /f "tokens=1* delims=|" %%B in (" |!CurExt!") do (
    endlocal
    if /i %%C neq %%~xA (
      set CurExt=%%~xA
      if _==_%%~xA (
        echo [no extension]
      ) else (
        echo %%~xA
      )
    )
  )
)) || (
  endlocal
  echo [no extension]
)
 
:Exit
if errorlevel 1 echo Error!
if exist "%TmpFile1%" del "%TmpFile1%"
if exist "%TmpFile2%" del "%TmpFile2%"
 


----------
Magically yours
Raistlin

Всего записей: 4198 | Зарегистр. 18-04-2005 | Отправлено: 23:43 03-01-2025
alex52mail

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо скрипт сохранения ключей Реестра - читаемых их файла   _fontRu-regList.txt
Это для русификации китайцев.
Но застопорился в именах сохраняемых reg файлов

Цитата:
cls
@echo.
set n=0
for /f  "eol=; tokens=1* delims=" %a in ( _fontRu-regList.txt ) do (
@echo.
@echo _______________________
@echo ---   n == %n%
set /A n=%n%+1
@echo ---   n == %n%
@echo ---   a == %a
reg export "%a"   %n%.reg /y
)

Надо или вытащить имя из последнего после \ типа:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Font Management
или хотел их нумеровать - по счетчик тут не работает.
 
Пробовал  
Setlocal EnableDelayedExpansion
set /A n=!n!+1

 
С таким же результатом:  всегда остается n = 0
 
Как сохранить  reg файлы под разными именами  или все в один - но без  
Windows Registry Editor Version 5.00
перед каждым новым добавлением.
 
Удачи.


----------
Везде трудно первые 15 лет, потом легче.
Все проблемы имеют ПРОСТОЕ решение
Ты начальник я дурак я начальник ты дурак. Но хуже дурака дурак с инициативой.

Всего записей: 1888 | Зарегистр. 04-09-2015 | Отправлено: 13:54 09-01-2025 | Исправлено: alex52mail, 14:07 09-01-2025
BorlandIMHO

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

Цитата:
всегда остается n =0

Так знамо дело. Вы же через "%%" раскрытие делаете, а не через "!!"...

Цитата:
Пробовал
Setlocal EnableDelayedExpansion
set /A n=!n!+1

Осталось Setlocal этот глобально включить, и %n% везде на !n! заменить...

Всего записей: 2845 | Зарегистр. 12-10-2006 | Отправлено: 14:01 09-01-2025
Inoz2000



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это фикция! %a в батниках не работает

Всего записей: 5373 | Зарегистр. 23-04-2009 | Отправлено: 14:52 09-01-2025
virjokk

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

Цитата:
%a в батниках не работает

Так % надо удваивать - %%, и все работает

Всего записей: 364 | Зарегистр. 19-05-2006 | Отправлено: 14:56 09-01-2025
alex52mail

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO   Спасибо.
Так делал  и с  ! !  но только запускал скрипт в  cmd
Запустил из батника: и все сохранилось в нумерованные.
 
Еще вопрос:
>findstr /i bth* "Drivers_List.txt"
BTAGService
BthA2dp
BthAvctpSvc
bttflt
HidBth
NetBT

но ищется и  BTA*   и *BT
 
Как чтобы искалось только   bth*  
 
Удачи.

----------
Везде трудно первые 15 лет, потом легче.
Все проблемы имеют ПРОСТОЕ решение
Ты начальник я дурак я начальник ты дурак. Но хуже дурака дурак с инициативой.

Всего записей: 1888 | Зарегистр. 04-09-2015 | Отправлено: 16:16 09-01-2025
BorlandIMHO

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

Цитата:
Как чтобы искалось только   bth*

Попробуйте почитать справку по findstr и/или find...
1) строку поиска вроде как положено заключать в двойные кавычки (хотя и необязательно).
2) чтобы findstr искала с использованием маски - у неё есть спец. ключ /R
3) значение маски "*" у findstr совсем не то же самое, что у других утилит комстроки...
 
Поиск "всё, что содержит bth в файле Drivers_List.txt":
findstr /i "bth" "Drivers_List.txt" или findstr /i "bth" < "Drivers_List.txt"


Всего записей: 2845 | Зарегистр. 12-10-2006 | Отправлено: 20:34 09-01-2025
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Подскажите такую вещь - мне надо запустить run.cmd SDK=10.0, к примеру.
Как в самом батнике проверить что ввели SDK=<...> и если да - то как получить эти самые <...> ?

----------
AMD Ryzen 7 7700 /ASRock B650M Pro RS /G.Skill RIPJAWS 32 ГБ /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9467 | Зарегистр. 11-05-2006 | Отправлено: 09:46 13-01-2025 | Исправлено: Aleksoid1978, 11:43 13-01-2025
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978
Внутри батника его параметры доступны в виде переменных %1, %2, %3 и т. д., где число - это порядковый номер параметра, разделители - точки, точки с запятой, пробелы, знаки равно, возможно и что-то еще. Соответственно, если батник запускать так: run.cmd SDK=10.0, то:
Код:
if /i not "%1"=="" set "%1=%2"
if "%SDK%"=="10.0" echo %SDK%
 

Всего записей: 364 | Зарегистр. 19-05-2006 | Отправлено: 12:45 13-01-2025 | Исправлено: virjokk, 12:48 13-01-2025
Arcadaw

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скажите пжлста, почему не работает такой батник
Для переменной "MyFolder2" работает, а для переменной MyFolder1 не работает.  
MyFolder1 почему-то глючит. Пробовал "MyFolder1*2" и выдает ошибку и фигню какая-то.
А для переменной MyFolder2 все работает. Как так?
 

Код:
@Echo Off
cls
SetLocal enabledelayedexpansion
Set MyFolder1=%APPDATA%\Mozilla
Set MyFolder2=%LOCALAPPDATA%\Mozilla
 
For /F "tokens=1-3" %%a IN ('Dir "%MyFolder1%" /-C/S/A:-D') Do Set SizeFolder1=!n2!& Set n2=%%c
For /F "tokens=1-3" %%a IN ('Dir "%MyFolder2%" /-C/S/A:-D') Do Set SizeFolder2=!n2!& Set n2=%%c
 
 
set /a Summa1 = (%SizeFolder1% + %SizeFolder2%) / 1048576
 
 
echo Сумма          = %Summa1%
echo Размер в Роаме  = %SizeFolder1%
echo Размер в Локале = %SizeFolder2%
 
endlocal
 
echo,
@pause
 


Всего записей: 1573 | Зарегистр. 25-03-2004 | Отправлено: 18:47 13-01-2025
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arcadaw
Вы словами можете описАть, что хотите?
Навскидку: "арифметика" в cmd ограничена, максимальное число (2^31-1)=2 147 483 647, или, если говорить о объёме файлов/папок, (2Гиб {"двоичных гигабайта"}-1 байт). Если размер любой из папок в байтах {или результат выполняемой операции} превышает предельное значение - при использовании его в операторе set /a вылезет ошибка:


Всего записей: 2845 | Зарегистр. 12-10-2006 | Отправлено: 21:18 13-01-2025 | Исправлено: BorlandIMHO, 21:24 13-01-2025
GCRaistlin



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

Цитата:
Как в самом батнике проверить что ввели SDK=<...>

Никак. = - это разделитель, такой же, как пробел.
 
Добавлено:
Ну то есть не то чтобы совсем никак (%* возвращает строку аргументов as is), но затруднительно.

----------
Magically yours
Raistlin

Всего записей: 4198 | Зарегистр. 18-04-2005 | Отправлено: 23:24 13-01-2025
Arcadaw

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

Цитата:
 Вы словами можете описАть, что хотите?  

Это часть кода. Хотел сделать батник, который запоминает начальный размер папок и конечный размер после работы sqlite над файлами sqlite.
 

Цитата:
при использовании его в операторе set /a вылезет ошибка:

Да такое было - "Размер ограничен 32 битами".
Понял, проверю размер папок. Спасибо.
 
 
Добавлено:
Есть ли другой способ получить размер папок?

Всего записей: 1573 | Зарегистр. 25-03-2004 | Отправлено: 07:47 14-01-2025
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии: bat, cmd


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru

Рейтинг.ru