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

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

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

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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mat86
Цитата:
"%%c"\AppData\Roaming\LibreOffice\4\user""
что это такое??
Убери лишние якобы "вложенные" кавычки...
 
 
Добавлено:
И еще при таких непонятках обычно делают отладку таким образом:
Код:
echo xcopy "%APPDATA%\LibreOffice\4\user" "%%c"\AppData\Roaming\LibreOffice\4\user"" /E /H /C /I /y)
чтобы увидеть какая реально командная строка формируется
 
Добавлено:
Или даже так:
Код:
(echo xcopy "%APPDATA%\LibreOffice\4\user" "%%c"\AppData\Roaming\LibreOffice\4\user"" /E /H /C /I /y))
а то мало ли что в переменных с процентами попадется
 
Добавлено:
да и когда используешь %%c внутри кавычек то здравый смысл требует использовать его так %%~c

Всего записей: 2704 | Зарегистр. 15-12-2003 | Отправлено: 11:21 19-12-2020
mat86



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yurkesha мое почтение, помню ваше активное присутствие в ветке по Bart Pe, еще в 2000х, спасибо за ваши труды.
С копированием разобрался, помогите пожалуйста с удалением, если такой вообще возможно. Нужно удаление всех файлов в папках пользователей, кроме определенных, например 111.txt и 222.txt.
Скрипт такой
Цитата:
for %%a in ("%UserProfile%") do for /d %%i in ("%%~dpa*") do ^
del /q/s "%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\" 2>nul
удаляются все файлы, возможно ли оставить необходимые

Всего записей: 428 | Зарегистр. 19-03-2009 | Отправлено: 14:11 19-12-2020 | Исправлено: mat86, 14:12 19-12-2020
Fenrizz



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

Цитата:
for %%a in ("%UserProfile%") do for /d %%i in ("%%~dpa*") do ^  
if not "%~nxi"=="111.txt" (
if not "%~nxi"=="222.txt" (del /q/s "%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\" 2>nul ))  


Всего записей: 412 | Зарегистр. 12-09-2017 | Отправлено: 14:32 19-12-2020
mat86



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz не сработало, все файлы не удаляются
 
 
Добавлено:
А если в виде костыля? Копирование файла который нельзя удалять во временную папку, удаление всех файлов из нужной директории, возвращение файла в нужную папку, удаление временной папки.
Что типа такого  

Цитата:
@echo off
for /f "tokens=3 delims=\" %%u in ("%UserProfile%") do set current=%%u
for /f "delims=" %%i in ('dir /b "%systemdrive%\Users" ^|findstr /v "defaultuser" ^|find /v "Public" ^|find /v "%current%"') do (
xcopy /S /E /H /R /Y "%systemdrive%\Users\%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\111.txt" "%systemdrive%\Users\%%i\TEMP1"
 
for %%a in ("%UserProfile%") do for /d %%i in ("%%~dpa*") do ^
del /q/s "%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\" 2>nul
 
for /f "tokens=3 delims=\" %%u in ("%UserProfile%") do set current=%%u
for /f "delims=" %%i in ('dir /b "%systemdrive%\Users" ^|findstr /v "defaultuser" ^|find /v "Public" ^|find /v "%current%"') do (
xcopy /S /E /H /R /Y "%systemdrive%\Users\%%i\TEMP1\111.txt" "%systemdrive%\Users\%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
 
 
for %%a in ("%UserProfile%") do for /d %%i in ("%%~dpa*") do ^
rd /q/s "%systemdrive%\Users\%%i\TEMP1" 2>nul
)
Понимаю что не совсем правильно

Всего записей: 428 | Зарегистр. 19-03-2009 | Отправлено: 14:37 19-12-2020
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mat86
Правильно ли я понял:
- выполняем для всех профилей пользователя
- использеум предопределенный относительный путь в каждом профиле
- удаляем все файлы кроме имеющих определенные имена из всех папок по предопределенному пути, не затрагивая при этом сами папки?

Всего записей: 2704 | Зарегистр. 15-12-2003 | Отправлено: 16:06 19-12-2020
mat86



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

Всего записей: 428 | Зарегистр. 19-03-2009 | Отправлено: 16:14 19-12-2020
KiloSub



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

Всего записей: 395 | Зарегистр. 30-05-2020 | Отправлено: 16:21 19-12-2020 | Исправлено: KiloSub, 05:51 21-12-2020
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mat86
ну тогда я бы сделал так:
Код:
@ECHO OFF
SET "RELETIVE_PATH=AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
for %%a in ("%UserProfile%") do (for /d %%i in ("%%~dpa*") do (CALL :METKA "%%i\%RELETIVE_PATH%"))
GOTO :EOF
 
:METKA
SET "WORK_DIR=%~1"
ECHO "%WORK_DIR%"
FOR /r "%WORK_DIR%" %%k IN (*) DO (
IF /I NOT "%%~nxk"=="111.txt" (
IF /I NOT "%%~nxk"=="222.txt" (
ECHO "%%~k"
)))
GOTO :EOF
Естественно нужную команду(удаление) надо вписать вместо ECHO "%%~k"
 
Добавлено:
Но вот на стадии отсева файлов можно поступать разнообразно -- можно читать откуда-нибудь список(включая тело скрипта от метки до метки, объявленную переменную или еще как), можно отсев делать не сравнением имени и расширения а через поиск в строке(либо целиком либо в конце) и так далее...
Тема отсева в целом слишком обширна и разнообразна, чтобы рассматривать ее в рамках любого отдельно взятого скрипта :)

Всего записей: 2704 | Зарегистр. 15-12-2003 | Отправлено: 17:20 19-12-2020
mat86



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

Цитата:
@ECHO OFF
SET "RELETIVE_PATH=AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
for %%a in ("%UserProfile%") do (for /d %%i in ("%%~dpa*") do (CALL :METKA "%%i\%RELETIVE_PATH%"))
GOTO :EOF
 
:METKA
SET "WORK_DIR=%~1"
ECHO "%WORK_DIR%"
FOR /r "%WORK_DIR%" %%k IN (*) DO (
IF /I NOT "%%~nxk"=="111.txt" (
IF /I NOT "%%~nxk"=="222.txt" (
del /q/s "%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\"
)))
GOTO :EOF

Если файл 111.txt лежит один в папке его не трогает, а если рядом любой другой удаляет оба
По поводу реализации, общий скрипт это все го лишь набор твиков для настройки и системы, каждый отдельный твик по возможности не связан с другими, здесь мне нужно изъять предустановленные ярлыки из панели задач (всякие магазины и прочее в десятке), но возможно для XP придется оставить ярлык "свернуть все", и в дальнейшем скрипт обязательно пригодится, все твики с комментариями, когда закончу выложу может кому еще пригодится тоже

Всего записей: 428 | Зарегистр. 19-03-2009 | Отправлено: 20:54 19-12-2020 | Исправлено: mat86, 21:06 19-12-2020
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mat86
ну да - там я с логикой намудрил... Тогда так переделывем:
Код:
:METKA
SET "WORK_DIR=%~1"
ECHO "%WORK_DIR%"
FOR /r "%WORK_DIR%" %%k IN (*) DO (
IF /I "%%~nxk"=="111.txt" GOTO :METKA1
IF /I "%%~nxk"=="222.txt" GOTO :METKA1
del /q/s "%%i\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\"
:METKA1
)
GOTO :EOF

 
Добавлено:
И вообще при таких раскладах наверное удобнее набор исключений хранить в виде набора строк или в переменной - тогда FOR /R надо будет переделать на FOR /F "usebackq" по результату выполнения потока команд типа`DIR....^|FINDSTR /I /V /E....` и добавить отдельный модуль для выполнения действия по результату парсинга.
 
Добавлено:
Исправлены критические ошибки в коде

Всего записей: 2704 | Зарегистр. 15-12-2003 | Отправлено: 22:46 19-12-2020 | Исправлено: yurkesha, 10:30 21-12-2020
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mat86
Ещё вариант, на это раз должен работать
 

Цитата:
forfiles /P "%WORK_DIR%" /S /C "cmd /c echo @path && if @isdir==FALSE if /I not @file=="""111.txt""" if /I not @file=="""222.txt""" del @path"

Всего записей: 412 | Зарегистр. 12-09-2017 | Отправлено: 23:47 19-12-2020
Xant1k



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не могу разобраться как с помощью команды SORT https://ss64.com/nt/sort.html выполнить в текстовом файле сортировку строк по длине по возрастанию?

Всего записей: 2918 | Зарегистр. 20-02-2009 | Отправлено: 14:37 20-12-2020 | Исправлено: Xant1k, 14:43 20-12-2020
GCRaistlin



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

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

Всего записей: 3100 | Зарегистр. 18-04-2005 | Отправлено: 14:58 20-12-2020
Xant1k



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Какой-то вася на стаковерфлоу посоветовал.. я в шоке. Бывают там конечно кадры, но такой примитив и совет..

Всего записей: 2918 | Зарегистр. 20-02-2009 | Отправлено: 18:55 20-12-2020
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Xant1k
Если задача разовая, то проще это в Экселе сделать.  
А если надо постоянно, то можно написать скрипт, но на больших файлах это будет очень медленно.

Всего записей: 412 | Зарегистр. 12-09-2017 | Отправлено: 19:52 20-12-2020
los

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

Цитата:
Какой-то вася на стаковерфлоу посоветовал..  

может там совет для unix sort? Но и там без awk, по моему, одним sort не решишь.
У тебя vim установлен?

Всего записей: 4657 | Зарегистр. 08-09-2001 | Отправлено: 20:08 20-12-2020
Fenrizz



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

Цитата:
может там совет для unix sort? Но и там без awk, по моему, одним sort не решишь.  

Скорее всего.
https://stackoverflow.com/questions/5917576/sort-a-text-file-by-line-length-including-spaces

Всего записей: 412 | Зарегистр. 12-09-2017 | Отправлено: 20:35 20-12-2020 | Исправлено: Fenrizz, 20:35 20-12-2020
iNNOKENTIY21



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

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

вырву из контекста и отвечу
скрипт запускает powershell, который прочитает файл, сортирует по длине строки и вернёт результат в консоль:

Код:
@echo off
SetLocal EnableExtensions
 
For /F "UseBackQ delims=" %%a in (`
  %SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.exe -ExecutionPolicy ByPass -command ". gc test.txt | sort -Property {$_.length}"
`) do (
  echo %%a
)
pause

test.txt — ваш файл

----------
Спасибо медикам!

Всего записей: 3019 | Зарегистр. 16-08-2012 | Отправлено: 23:06 20-12-2020
mat86



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yurkesha, а так ничего не удаляет (
 
Добавлено:
Fenrizz сработало
 
Добавлено:
yurkesha и Fenrizz спасибо большое
 
 
 
Добавлено:
В XP почему то не срабатывает, ничего не удаляет, так пробовал

Цитата:
@ECHO OFF
SET "RELETIVE_PATH=Application Data\Microsoft\Internet Explorer\Quick Launch\"
for %%a in ("%UserProfile%") do (for /d %%i in ("%%~dpa*") do (CALL :METKA "%%i\%RELETIVE_PATH%"))
GOTO :EOF
 
:METKA
SET "WORK_DIR=%~1"
forfiles /P "%WORK_DIR%" /S /C "cmd /c echo @path && if @isdir==FALSE if /I not @file=="""Свернуть все окна.scf"" if /I not @file=="""222.txt""" del @path"
GOTO :EOF

команда %UserProfile% в ХР работает

Всего записей: 428 | Зарегистр. 19-03-2009 | Отправлено: 23:16 20-12-2020 | Исправлено: mat86, 23:22 20-12-2020
Fenrizz



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mat86
У меня нет XP, так что не могу проверить.  
Могу пока посоветовать заменить  

Цитата:
del @path

на  

Цитата:
echo DELETE

и проверять условия по одному.
 
"Свернуть все окна.scf" - файл в правильной (DOS 866) кодировке?

Всего записей: 412 | Зарегистр. 12-09-2017 | Отправлено: 09:08 21-12-2020
Открыть новую тему     Написать ответ в эту тему

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

Компьютерный форум 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