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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 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

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

Maz



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

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ 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.51 до Windows 10) и command.com (DOS 5.0 и выше). Старые командные процессоры можно запускать на более новых ОС, хотя не всё может работать корректно. Подробная документация по командам cmd.exe и стандартным утилитам ОС для NT 3.51, NT 4.0, NT 5.0 (Windows 2000) и NT 5.2 (Windows Server 2003). Сборник представляет исторический интерес, а также незаменим для тех, у кого появилось желание сделать свои скрипты работоспобными не только на текущей версии ОС. Ссылки wdho.ru tinyupload.com dbree.org
 
· Сборник одним архивом: Сотни Win32 утилит командной строки, нетривиальные .cmd файлы, .bat miniperl скрипты (не требующие полноценной установки Perl), FAR Manager с плагинами и настройками, разное для DOS/DOSBox (откуда под Win32 интерес представляют три продвинутых "мультисистемных" .bat файла да ещё, может быть, оболочка Necromancer DOS Navigator с поддержкой LFN и доступом к буферу обмена Windows). Краткие описания всего - в файликах files.bbs

Всего записей: 37561 | Зарегистр. 26-02-2002 | Отправлено: 13:35 19-09-2020 | Исправлено: Maz, 07:16 24-04-2021
BorlandIMHO

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

Цитата:
"UserDocuments=\\Domain\Public\Users\Raistlin\My"
Потому что папка называется "My Documents".  

Сдаётся мне - у вас кавычек не хватает в set...
А ещё, наверное, на такой случай нужно {set "UserDocuments=%%I"} всё-таки записывать как {set "UserDocuments=%%~I"}. Да и call там не пришей рукав - и без него нормально работает.

----------
http://www.imho.ws

Всего записей: 1308 | Зарегистр. 12-10-2006 | Отправлено: 22:47 15-11-2021
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Silver Raven
В любой ОС можно сделать так, что имя папки документов будет с пробелами. И имя папки профиля, кстати, тоже.
 
Добавлено:
BorlandIMHO

Цитата:
Сдаётся мне - у вас кавычек не хватает в set...

У меня не было set. У меня было echo.
 

Цитата:
на такой случай нужно {set "UserDocuments=%%I"} всё-таки записывать как {set "UserDocuments=%%~I"}

Зачем?
 

Цитата:
Да и call там не пришей рукав - и без него нормально работает.

Тут-то да, но попробуйте, например, получить реальное имя каталога с профилями пользователей из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

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

Всего записей: 3195 | Зарегистр. 18-04-2005 | Отправлено: 22:49 15-11-2021
BorlandIMHO

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

Код:
for /f "tokens=3*" %%I in (' reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul ') do set "UserDocuments=%%~I"

Наверное, там ещё и к tokens надо * добавить...
Тогда пробелы нормально обработаются.
 
Добавлено:

Цитата:
попробуйте, например, получить реальное имя каталога с профилями пользователей из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

Ну здесь да, без call не обойтись.

Код:
for /f "tokens=3*" %%I in (' reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /v "ProfilesDirectory" 2^>nul ') do call set "ProfilesDirectory=%%~I"
echo %ProfilesDirectory%
pause


----------
http://www.imho.ws

Всего записей: 1308 | Зарегистр. 12-10-2006 | Отправлено: 22:54 15-11-2021
GCRaistlin



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

Цитата:
У меня принимает почему-то?...

Да, кстати, у меня тоже. Значит, дело не в "\", а в том, что и здесь из реестра имя папки извлекается неправильно. Впрочем, это к лучшему: цикл с "tokens=3" в любом случае надо переделывать.
 
Добавлено:
BorlandIMHO

Цитата:
Наверное, там ещё и к tokens надо * добавить...
Тогда пробелы нормально обработаются.

Как бы не так.

Код:
 
for /f "tokens=3*" %A in ("1 2 3  4 5 6") do @echo _%A_
_3_
for /f "tokens=3*" %A in ("1 2 3  4 5 6") do @echo _%B_
_4 5 6_
 

Самая мякотка в том, что между 3 и 4 у меня два пробела, а не один.

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

Всего записей: 3195 | Зарегистр. 18-04-2005 | Отправлено: 23:02 15-11-2021 | Исправлено: GCRaistlin, 23:07 15-11-2021
BorlandIMHO

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

Цитата:
Самая мякотка в том, что между 3 и 4 у меня два пробела, а не один.

Испешали фор Ю:

Код:
for /f "tokens=2,*" %%I in (' reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul ') do set "UserDocuments=%%~J"

Хоть 20 пробелов забивайте.


----------
http://www.imho.ws

Всего записей: 1308 | Зарегистр. 12-10-2006 | Отправлено: 23:31 15-11-2021
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Так работает.
Но я, когда говорил про "не простое дело", имел в виду задачу получения значения параметра реестра с произвольным именем. Например, содержащим пробелы.
 
Кстати, замечу, что вместо
set "UserDocuments=%%~J"
здесь можно использовать
set UserDocuments=%%J

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

Всего записей: 3195 | Зарегистр. 18-04-2005 | Отправлено: 23:52 15-11-2021
BorlandIMHO

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

Цитата:
имел в виду задачу получения значения параметра реестра с произвольным именем. Например, содержащим пробелы.

Ну, к примеру, так:

Код:
for /F "delims=" %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Local AppData" 2^>nul') do set "TMPVALUE=%%A"
set "LocalAppData=%TMPVALUE:*REG_SZ    =%"
echo "Local AppData" is: "%LocalAppData%"
pause

Отрезаем по {тип получаемых данных+4 пробела}; тип должен быть известен и не должен содержаться в собственно имени объекта и его значении.
Не совсем универсально с точки зрения любых возможных имён/значений - но хоть что-то.
 
 
Добавлено:
P.S. Разделов/параметров с "REG_SZ" в имени в реестре 10-ки боевой машины не обнаружено.
Со значениями несколько хуже, но чтобы не просто REG_SZ, а {REG_SZ+4 пробела} тоже не нашлось.

----------
http://www.imho.ws

Всего записей: 1308 | Зарегистр. 12-10-2006 | Отправлено: 00:34 16-11-2021
GCRaistlin



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

Цитата:
тип должен быть известен

Вы, когда лезете в regedit смотреть значение параметра, всегда знаете его тип?
 

Цитата:
Отрезаем по {тип получаемых данных+4 пробела}

... и обламываемся, запустив наш код на WinXP: там вместо пробелов табуляция.
 

Цитата:
Разделов/параметров с "REG_SZ" в имени в реестре 10-ки боевой машины не обнаружено.

Это не значит, что их не может быть.
 
reg.exe использует определенные правила эскейпирования кавычек и слешей в именах параметров. Наш код должен корректно этим заниматься. А в Win2k reg.exe вообще нет, а значение получить в принципе можно, потому что там есть regedit.exe, который умеет экспортировать. В общем, тут есть где развернуться.

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

Всего записей: 3195 | Зарегистр. 18-04-2005 | Отправлено: 01:01 16-11-2021
INKOGNI



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
Спасибо, работает) Сделал так, правильно, ничего лишнего не удалит?:
 
@echo on
for /d /r "O:\FirefoxPortable\Data\profile\" %%I in (http?++*) do (
echo %%I
rd /S /Q "%%I"
)  
 
А команда с  forfiles удаляет через вызов другой что ли программы?

Всего записей: 1273 | Зарегистр. 09-01-2006 | Отправлено: 01:18 16-11-2021 | Исправлено: INKOGNI, 01:54 16-11-2021
Fenrizz



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

Цитата:
 Сделал так, правильно, ничего лишнего не удалит?:  

Не должно Но, в любом случае, лучше сначала закомментировать команду rd (REM rd /S /Q "%%I") и проверть глазами список папок на удаление
И ещё этот вариант не найдёт папки с аттрибутом "Скрытый", а forfiles - найдёт.
 

Цитата:
А команда с  forfiles удаляет через вызов другой что ли программы?

Да, через вызов командного процессора cmd с параметрами.

Цитата:
Internal CMD.exe commands should be preceded with "cmd /c".

Всего записей: 471 | Зарегистр. 12-09-2017 | Отправлено: 05:37 16-11-2021 | Исправлено: Fenrizz, 05:45 16-11-2021
080808



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли както конвертнуть в пакетном режиме DOCX в TXT с сохранением переносов и подержкой спецсимволов (много специфических знаков из разных языков)?

Всего записей: 58 | Зарегистр. 08-08-2008 | Отправлено: 06:59 16-11-2021
BorlandIMHO

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

Цитата:
конвертнуть в пакетном режиме DOCX в TXT

Насчёт переносов - ХЗ; думается, правильнее всё-таки при конвертации в текст переносы удалять...
А вообще OpenOffice/LibreOffice умеют.
Курите справку по соответствующему продукту, в частности опции --invisible (без GUI) и --convert-to (собственно конвертация).
https://ask.libreoffice.org/t/convert-to-command-line-parameter/840

----------
http://www.imho.ws

Всего записей: 1308 | Зарегистр. 12-10-2006 | Отправлено: 09:25 16-11-2021
INKOGNI



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

Цитата:
Но, в любом случае, лучше сначала закомментировать команду rd (REM rd /S /Q "%%I")

А можно пример комментария, я не разбираюсь, как её написать и в каком месте.
 

Цитата:
 
@echo on
for /d /r "O:\FirefoxPortable\Data\profile\" %%I in (http?++*) do (
echo %%I
rd /S /Q "%%I"
)  
 

И подскажите, какой командой удалить несколько файлов с разными расширениями из одной папки и где указать путь папки. Например файлы log.txt, storage-sync-v2.sqlite-shm, containers.json

Всего записей: 1273 | Зарегистр. 09-01-2006 | Отправлено: 09:29 16-11-2021 | Исправлено: INKOGNI, 09:31 16-11-2021
Fenrizz



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

Цитата:
А можно пример комментария, я не разбираюсь, как её написать и в каком месте.  

То, что в скобках - REM rd /S /Q "%%I"
 

Цитата:
И подскажите, какой командой удалить несколько файлов с разными расширениями из одной папки и где указать путь папки. Например файлы log.txt, storage-sync-v2.sqlite-shm, containers.json

Проще всего удалять каждый файл по отдельности:

Код:
del /q C:\Folder\Subfolder\log.txt
del /q C:\Folder\Subfolder\storage-sync-v2.sqlite-shm
del /q C:\Folder\Subfolder\containers.json


Всего записей: 471 | Зарегистр. 12-09-2017 | Отправлено: 10:32 16-11-2021
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот, что еще хотел оптимизировать:
есть файл Skyrim.ini, лежащий все там же где и прошлый проблемный. Его раньше копировал с заменой, но правильнее (для моих нужд) редактировать в нем содержимое стоки sResourceArchiveList2.
 
Алгоритм: Находим sResourceArchiveList2= и все что идет после знака, меняем на нашу переменную %HDAudioEnglishLocalizationArchivesList% (текст, в одну строку с запятыми и пробелами). Сохраняем. Через временный файл такое гонять не вариант, наверно? (там секции, упаси боже их поломать, читаться не будет)
 
P.S. Хочу избавиться от этого:
 
set "SkyrimINIFolder=%UserDocuments%\My Games\Skyrim Special Edition"
set "SkyrimPrefsINI=%UserDocuments%\My Games\Skyrim Special Edition\SkyrimPrefs.ini"
set "SkyrimINI=%UserDocuments%\My Games\Skyrim Special Edition\Skyrim.ini"
 
и поменять на, что-то такое:
 
"%SkyrimINIFolder%\Skyrim.ini"
"%SkyrimINIFolder%\SkyrimPrefs.ini"
 
Это можно оформить?

Всего записей: 129 | Зарегистр. 12-10-2012 | Отправлено: 16:28 16-11-2021 | Исправлено: Silver Raven, 16:29 16-11-2021
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Silver Raven
Можно - через временный файл.

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

Всего записей: 3195 | Зарегистр. 18-04-2005 | Отправлено: 18:16 16-11-2021
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Чтобы не изобретать велосипед:

Код:
 
for /f "tokens=2,*" %%I in (' reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul ') do set "UserDocuments=%%J"
 
set "TempConfig=Silver Raven mods pack data\temp_config.tmp"
set "SkyrimINIFolder=%UserDocuments%\My Games\Skyrim Special Edition"
 
set "HDAudioEnglishLocalizationArchivesList=Skyrim - Textures0.bsa, Skyrim - Textures1.bsa, Skyrim - Textures2.bsa, Skyrim - Textures3.bsa, Skyrim - Textures4.bsa, Skyrim - Textures5.bsa, Skyrim - Textures6.bsa, Skyrim - Textures7.bsa, Skyrim - Textures8.bsa, Skyrim - Patch.bsa, Unofficial HD Audio Project - Music.bsa, Unofficial HD Audio Project - ENG0.bsa, Unofficial HD Audio Project - ENG1.bsa, Unofficial HD Audio Project - ENG2.bsa, Unofficial HD Audio Project - ENG3.bsa, Unofficial HD Audio Project - ENG4.bsa"
 
if exist "%TempConfig%" goto TempConfig
for /f "usebackq delims=" %%A in ("%SkyrimINIFolder%\Skyrim.ini") do (
  for /f "delims== tokens=1*" %%B in ("%%A") do (
 
 
    >> "%TempConfig%" (
      if /i %%B==sResourceArchiveList2 (
        echo %%B="%HDAudioEnglishLocalizationArchivesList%"        
      ) else (
        echo %%A
      )
    ) || (
      del "%TempConfig%"
      exit /b 1
    )
  )
)
move /y "%TempConfig%" "%SkyrimINIFolder%\Skyrim.ini"
 

?

Всего записей: 129 | Зарегистр. 12-10-2012 | Отправлено: 18:20 16-11-2021 | Исправлено: Silver Raven, 18:21 16-11-2021
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Silver Raven
Я не знаю. Пробуйте.
Если нужно сохранить пустые строки: http://forum.ru-board.com/topic.cgi?forum=5&topic=50615&start=1080#4 (см. также пару сообщений ниже).

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

Всего записей: 3195 | Зарегистр. 18-04-2005 | Отправлено: 18:35 16-11-2021
INKOGNI



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

Цитата:
То, что в скобках - REM rd /S /Q "%%I"  

Правда не понимаю, где писать комментарий, в каких скобках? В каком месте батника. Куда писал что, всёравно окно сразу после исполнения закрывается.
 
Разобрался, в конце команд нужно было добавить pause
 
@echo off
for /d /r "O:\FirefoxPortable\Data\profile\" %%I in (http?++*) do (
echo %%I
rem
rd /S /Q "%%I"
)
pause

Всего записей: 1273 | Зарегистр. 09-01-2006 | Отправлено: 19:10 16-11-2021 | Исправлено: INKOGNI, 21:21 16-11-2021
Silver Raven

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

Цитата:
Если нужно сохранить пустые строки: http://forum.ru-board.com/topic.cgi?forum=5&topic=50615&start=1080#4 (см. также пару сообщений ниже).

Не, тот способ не помог. У меня все в одну кучу лепит, удаляя пустые стррки.

Всего записей: 129 | Зарегистр. 12-10-2012 | Отправлено: 21:08 16-11-2021 | Исправлено: Silver Raven, 21:08 16-11-2021
Открыть новую тему     Написать ответ в эту тему

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

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru

Рейтинг.ru