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

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

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

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

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

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

Код:
<# :
@echo off
powershell.exe -NoP -NoL -NonI -EP Bp -c "&{[ScriptBlock]::Create((gc -lit '%~f0' -enc UTF8) -join [Char]10).Invoke(@(%*))}"
exit /b
#>
 
$bpath='C:\Program Files\Bandicam\bandicam.ini'
sp $bpath IsReadOnly $false -ea 0
$ini=@(gc $bpath -ea 0)
if (-not $ini) {$ini=@('[GENERAL]')}
sc $bpath $(if ($ini -like "*UPDATE*") {$ini -Replace "(?<=^UPDATE\s*=).*"," 0"} else {$ini+"UPDATE= 0"}) -ea 0
sp $bpath IsReadOnly $true

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 11:36 24-10-2024 | Исправлено: virjokk, 11:47 24-10-2024
griboed

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кластер. Может кому интересно будет.
Код:
@echo off
chcp 65001 >nul
color 0f
setlocal enabledelayedexpansion
 
for /f "tokens=1-5" %%A in ('"echo list disk | diskpart | findstr /irc:"Disk [0-9]""') do (
    echo %%A %%B - %%D %%E
    echo ------------------------------
    for /f "tokens=2" %%P in ('"(echo select disk %%B & echo list partition) | diskpart | findstr /irc:"Partition [0-9]""') do call :Cluster %%B %%P
    echo.
)
echo ------------------------------
<nul set /p "T=Press any key to exit... "
pause >nul
exit /b
 
:Cluster
set "Flag=type"
for /f "tokens=2 delims=:" %%S in ('"(echo select disk %1 & echo select partition %2 & echo filesystems) | diskpart | findstr /i "Type Unit""') do (
    if "!Flag!"=="type" (
        set "Flag=cluster"
        set "V=     %%S"
        set "V=!V:~-6!"
        <nul set /p "Tmp=%%P ^>^> !V! : "
    ) else (
        echo %%S
        exit /b
    )
)
exit /b

Всего записей: 7 | Зарегистр. 10-05-2024 | Отправлено: 10:47 25-10-2024 | Исправлено: griboed, 10:48 25-10-2024
gntix



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

Цитата:
Мнэ-э... тема вроде как про написание батников и скриптов, а не копирование файлов.
 

В шапке есть ссылка на сборник утилит для скриптов. Представь себе – их тоже нужно копировать куда-то (желательно в каталог, который присутствует в %PATH%). По этой аналогии я всего лишь предложил свой вариант восстановления работоспособности wmic в bat/cmd.

Всего записей: 728 | Зарегистр. 07-12-2004 | Отправлено: 01:22 29-10-2024
DeZz



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

Цитата:
я всего лишь предложил свой вариант

так себе вариант... но окей, засчитаем как альтернативное возможное решение

Всего записей: 1270 | Зарегистр. 23-01-2006 | Отправлено: 10:24 29-10-2024
griboed

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

Код:
@echo off
chcp 65001>nul
color F0
pushd "%~dp0"
set "output=DriversShow.txt"
mode con:cols=150 lines=35
setlocal enabledelayedexpansion
 
if exist "%output%" del /q "%output%"
set Count=0
for /f "tokens=*" %%S in ('"dism.exe /English /Online /Get-Drivers /format=table | findstr "^|""') do (
    set /a Count+=1
    if !Count! LEQ 2 echo    ^|%%S >> "%output%"
    if !Count!==3    echo ---^|%%S >> "%output%"
    if !Count! GTR 3 (
        set /a Number=!Count!-3
        set "Number=    !Number!"
        set "Number=!Number:~-2!"
        echo !Number! ^|%%S >> "%output%"
    )
)
type "%output%"
echo.
pause >nul

Всего записей: 7 | Зарегистр. 10-05-2024 | Отправлено: 10:20 30-10-2024 | Исправлено: griboed, 10:23 30-10-2024
MaraGame24



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые скриптоделы...
 
Есть ли возможность сделать BAT, что бы он устанавливал файл.ЕХЕ службой на автомат, и был сразу готов к работе без перезагрузки системы ? (после запустится другой файл.ЕХЕ, зависящий от уже установленного службой).
 
Я в BAT не понимаю...Хотелось бы готовый вариант, если получится.

Всего записей: 984 | Зарегистр. 25-11-2023 | Отправлено: 10:10 31-10-2024 | Исправлено: MaraGame24, 10:18 31-10-2024
griboed

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А я тебя не понимаю. поподробнее. пожалуйста.

Всего записей: 7 | Зарегистр. 10-05-2024 | Отправлено: 10:24 31-10-2024
virjokk

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

Код:
sc create progserv binPath="C:\path\file.exe" DisplayName="MyProgram" type=own start=auto

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 10:46 31-10-2024 | Исправлено: virjokk, 10:50 31-10-2024
MaraGame24



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

Всего записей: 984 | Зарегистр. 25-11-2023 | Отправлено: 10:50 31-10-2024 | Исправлено: MaraGame24, 11:05 31-10-2024
sakatgg

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В этой теме пост был предложен способ удаления из папки всех файлов со списком исключений
 
Пример

Код:
$nodel = @(
'111.txt',
'222.txt'
)
Remove-Item -Path "H:\1\" -Recurse -Exclude $nodel

Как сделать, чтобы этот скрипт обрабатывал папки , для примера, нужно еще чтобы не удалял папку с  файлом
 
H:\1\aaa\333.txt
 
Если просто добавлю в список '333.txt' - то удаляется. Не программист. Спасибо.
 
P.S., BorlandIMHO
Попробовал такие варианты - папка aaa удаляется, не прокатывает

Код:
$nodel = @(
'111.txt',
'222.txt',
'*\aaa\*'
)
Remove-Item -Path "H:\1\" -Recurse -Exclude $nodel


Код:
$nodel = @(
'111.txt',
'222.txt',
'H:\1\aaa\*'
)
Remove-Item -Path "H:\1\" -Recurse -Exclude $nodel

 
P.S.2, virjokk
Отлично сработало Спасибо.
P.S.2
 
BorlandIMHO,  

Цитата:
Тогда придётся существенно усложнять "удалялку": сначала отбор "что удалять", потом фильтрация "что оставить", потом remove-item...

Такой вариант тоже приходится, только запятую в конце 3 строки надо убрать, с ней скрипт не работает.  

Цитата:
в данном случае полностью игнорируется содержимое всех папок с именем "aaa"

У меня вообще-то выдал запрос на подтверждение удаления. И в зависимости как ответишь, удаляет или нет папку aaa
Не совсем удобно с подтверждением. Спасибо

Всего записей: 1219 | Зарегистр. 18-11-2006 | Отправлено: 17:49 03-11-2024 | Исправлено: sakatgg, 21:37 03-11-2024
BorlandIMHO

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

Цитата:
Как сделать

Курить опцию -Exclude командлета Remove-Item
Очевидно {в данном случае}, требуется добавить маску типа `*\aaa\*` {или `h:\1\aaa\*` , это надо по месту смотреть} к $nodel.

См. ниже

Всего записей: 2811 | Зарегистр. 12-10-2006 | Отправлено: 19:36 03-11-2024 | Исправлено: BorlandIMHO, 21:11 03-11-2024
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sakatgg
Remove-Item вообще не очень интуитивно работает. Попробуйте так:
Код:
$nodel = @(
   '111.txt'
   '222.txt'
   '333.txt'
   'aaa'
)
Remove-Item -Path "H:\1\*" -Recurse -Exclude $nodel


Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 20:14 03-11-2024 | Исправлено: virjokk, 20:15 03-11-2024
BorlandIMHO

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

Цитата:
Попробовал такие варианты - папка aaa удаляется, не прокатывает

Похоже - именно так...
Тогда придётся существенно усложнять "удалялку": сначала отбор "что удалять", потом фильтрация "что оставить", потом remove-item...

Код:
$nodel = @(
'111.txt',
'222.txt',
)
gci -Path "H:\1\*" -Recurse -Exclude $nodel | where-object -property fullname -notlike '*\aaa\*'|Remove-Item

(в данном случае полностью игнорируется содержимое всех папок с именем "aaa", независимо от степени вложенности; корневая папка 'H:\1' не удаляется).

Всего записей: 2811 | Зарегистр. 12-10-2006 | Отправлено: 21:01 03-11-2024 | Исправлено: BorlandIMHO, 21:02 03-11-2024
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Действительно, Remove-Item лучше использовать в связке с Get-Item, Get-ChildItem, но даже тогда порой этот командлет работает странно. К примеру, вышепоставленную задачу должна решать такая команда:
Код:
$nodel = @(
  '111.txt'
  '222.txt'
)
Get-Item -Path "H:\1\*" -Exclude 'aaa' | Remove-Item -Recurse -Force -Exclude $nodel

Но нет, по неизвестной причине непустые папки из H:\1 удалены не будут. А вот так сработает:
Код:
Get-Item -Path "H:\1\*" -Exclude 'aaa' | %{Remove-Item -Path $_.FullName -Recurse -Force -Exclude $nodel}

Если я правильно понял, требуется оставить не все папки aaa любой вложенности, а только из корня H:\1

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 22:27 03-11-2024
sakatgg

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

Цитата:
Если я правильно понял, требуется оставить не все папки aaa любой вложенности, а только из корня H:\1

Надо всё удалить в H:\1 и вложенных папках, кроме файлов в списке в корне этой папки,  
в исключение надо добавить некоторые файлы, которые находятся в папках, остальное в вложенных папках удалить.
 
Этих папок с файлами нужными может быть много. Как бы их прописать с относительными путями до файлов, в виде списка, в одну строку неудобно.
 
Типа такого
 
H:\1\aaa\333.txt
H:\1\bbb\444.txt
H:\1\ccc\555.txt
 
P.S.  

Цитата:
Но если все же в список вносить относительные, то так:

Всё под чистую удаляет

Цитата:
Да, со слешами ошибка была...

Папки удалились все, остались только 111.txt 222.txt
 
P.S.2. virjokk

Цитата:
Сначала удаляем все файлы, не входящие в $nodel, затем все оставшиеся пустые папки:

Всё чётко сработал Спасибо

Всего записей: 1219 | Зарегистр. 18-11-2006 | Отправлено: 22:47 03-11-2024 | Исправлено: sakatgg, 14:27 04-11-2024
virjokk

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

Цитата:
Как бы их прописать с относительными путями

А ниже список у вас с абсолютными путями. Но если все же в список вносить относительные, то так:

Код:
$nodel = @(
  '111.txt'
  '222.txt'
  '\aaa\333.txt'
  '\bbb\444.txt'
  '\ccc\ddd\555.txt'
)
$list = $nodel | %{Get-Item -Path $("H:\1"+$_) -ea 0}
Get-Item -Path "H:\1\*" | ?{$list.FullName -notcontains $_.FullName} | Remove-Item -Recurse -Force

 
Добавлено:
sakatgg
Да, со слешами ошибка была...

Код:
$nodel = @(
  '111.txt'
  '222.txt'
  'aaa\333.txt'
  'bbb\444.txt'
  'ccc\ddd\555.txt'
)
$list = $nodel | %{Get-Item -Path $("H:\1\"+$_) -ea 0}
Get-Item -Path "H:\1\*" | ?{$list.FullName -notcontains $_.FullName} | Remove-Item -Recurse -Force

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 23:30 03-11-2024
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сначала удаляем все файлы, не входящие в $nodel, затем все оставшиеся пустые папки:
Код:
$nodel = @(
  '111.txt'
  '222.txt'
  'aaa\333.txt'
  'bbb\444.txt'
  'ccc\ddd\555.txt'
)
$list = $nodel | %{Get-Item -Path $("H:\1\"+$_) -ea 0}
Get-ChildItem -Path "H:\1\*" -File -Recurse | ?{$list.FullName -notcontains $_.FullName} | Remove-Item -Recurse -Force
do {
   $dirs = (Get-ChildItem "H:\1\*" -Directory -Recurse | ?{(Get-ChildItem $_.fullName).count -eq 0}).FullName
   $dirs | %{if ($_) {Remove-Item $_}}
} while ($dirs.count -gt 0)

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 07:01 04-11-2024 | Исправлено: virjokk, 07:04 04-11-2024
sakatgg

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
virjokk
Всё нормально, но обнаружилась еще проблема.
 
Нужно в список исключений добавить папки, например такую  
 
h:\1\eee\fff
 
Пробовал такие варианты - не срабатывет

Код:
'eee\fff'
'eee\fff*'
'eee\fff\'
'eee\fff'\*'

Возможно как-то для полноты добавить в исключение и папки? Спасибо
 
P.S. Обнаружил еще баг
 
Вариант, если в корне H:\1 нет файлов, а только папки с файлами - то скрипт ничего не удаляет в папках
Если есть хоть один файл в корне, то скрипт отрабатывает нормально
 
P.S.

Цитата:
Баг вроде исправил.

Всё также, если файлов в корне нет, то скрипт не работает.  
Подкидываю один файл в корень - срабатывает отлично, папки нужные остаются
 
P.S.2  

Цитата:
Еще чуть поправил, пробуйте

Как-то не предсказуемо. На одном примере вроде без файлов в корне нормально отрабатывает,
на других - папку, что в исключении пустой оставляет, например такой  простой вариант, папка ccc получается пустой
 
test.7z
 
Закономерности не выявил, в чем причина не понятно.
P.S.3

Цитата:
Очередная попытка, из вашего тестового архива если в исключении 'ccc'

Сразу проверил на системе - отработал нормально Спасибо.

Всего записей: 1219 | Зарегистр. 18-11-2006 | Отправлено: 16:19 04-11-2024 | Исправлено: sakatgg, 12:12 06-11-2024
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sakatgg
Баг вроде исправил. Теперь можно и папки в список исключений:
Код:
 
$nodel = @(
   '111.txt'
   '222.txt'
   'aaa\333.txt'
   'bbb\ccc\444.txt'
   'ddd\eee'
   'fff\ggg'
)
$list = $nodel | %{gi $("H:\1\"+$_) -ea 0}
$listfile = @(($list | ?{-not $_.PSIsContainer}).FullName)
$listdir = @(($list | ?{$_.PSIsContainer}).FullName)
if ($listdir) {$listdir = @(gci "H:\1" -Directory -Recurse | %{foreach ($pattern in $listdir) {if($_.FullName -like "$pattern*") {$_.FullName}}})}
if ($listdir) {$listfile += @(($listdir | %{gci $_ -File -ea 0}).FullName)}
gci "H:\1" -Recurse -File | ?{$listfile -notcontains $_.FullName} | Remove-Item -Recurse -Force
do {
   $dirs = gci "H:\1" -Directory -Recurse | ?{$listdir -notcontains $_.FullName} | ?{(gci $_.fullName).count -eq 0}
   $dirs | %{if ($_.FullName) {Remove-Item $_.FullName -ea 0 -Force}}
} while ($dirs.count -gt 0)

 
Добавлено:
Код крайне не оптимален, на больших объемах файлов/каталогов будет дико тормозить
Добавлено:
Еще чуть поправил, пробуйте
Добавлено:
Очередная попытка, из вашего тестового архива если в исключении 'ccc', в ней все остается в сохранности.
Надо еще, конечно, погонять с разными вариантами списка исключений и состава целевой папки (пустой/непустой корень, папки с файлами/без, только папки, только файлы и т. д.)

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 07:20 05-11-2024 | Исправлено: virjokk, 11:49 06-11-2024
MaraGame24



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые скриптоделы...
 
Можно сделать в этом батнике проверку на существование диска "W" в системе ???
Т.Е. если диск с такой буквой "W" уже есть в системе, тооо не создавать его, ааа пропустить создание, и ехать дальше выполнять BAT.
 
@echo off
pushd %~dp0
compact /u /i /q /a /s:"%TEMP%"
chcp 65001>nul
(
  echo sel vdisk file="%~dp0W.VHD"
  echo attach vdisk
  echo sel part 1
  echo assign letter=W
) | diskpart
 
Я в BAT ни бум-бум )))
Желательно готовый вариант.

Всего записей: 984 | Зарегистр. 25-11-2023 | Отправлено: 11:33 10-11-2024 | Исправлено: MaraGame24, 11:37 10-11-2024
Открыть новую тему     Написать ответ в эту тему

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

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