Довідник

Довідник командного рядка

Кожна команда, кожен параметр і кожен код завершення bws, версія 0.5.0. Найавторитетніша - bws --help, і вона довша: ця сторінка - та сама поверхня, розкладена для читання.

Команди

Одинадцять команд. snapshot - іменник і приймає після себе слово. tool теж іменник, і сам по собі виводить список інструментів.

bws list [--query TEXT] [--signatures] [--memory] [--required-by] [--follow-network] [--json] [--timing]
bws show NAME [--full] [--follow-network] [--json] [--timing]
bws stop|start|restart NAME [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
bws kill NAME [--force] [--restart] [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
bws start-type NAME automatic|delayed|manual|disabled [--stop] [--dry-run] [--json] [--timing]
bws snapshot create [FILE] [--note TEXT] [--follow-network] [--force] [--json] [--timing]
bws snapshot diff EARLIER LATER [--exit-code] [--json] [--timing]
bws snapshot diff EARLIER --live [--exit-code] [--json] [--timing]
bws history [NAME] [--json] [--timing]
bws tool
bws tool fix
bws tool fix NAME [--dry-run] [--timeout SECONDS] [--json] [--timing]
bws license [--components]
bws --help
bws --version

Для помилково набраної команди пропонується та, яку ви, імовірно, мали на увазі, і виконання завершується кодом 2, а не робить щось близьке до того, про що ви просили.

$ bws lst
There is no command lst. Did you mean list?

Що робить кожна команда

list і show

list - це вся машина, звужена за допомогою --query. show - один запис з усім, що про нього відомо: підпис, привілеї, дескриптор безпеки й пам'ять, і все це читається щоразу, бо для одного запису це коштує близько шістдесяти мілісекунд, тоді як для всієї машини - секунду. Поля, які справді порожні, пропускаються, якщо не передати --full. Поле, яке ніхто не зміг прочитати, друкується в будь-якому разі, бо його пропуск виглядав би як відповідь.

stop, start і restart

Кожна будує план і виконує його. --dry-run друкує план і нічого не змінює, --dependents вносить до нього служби, які б зламалися, окремими кроками, а --timeout каже, скільки один крок може тривати без прогресу. Драйвери відхиляються, а не пробуються, бо зупинка драйвера ядра часто необоротна без перезапуску.

kill - для служби, яка не зупиняється

Вона просить службу зупинитися й завершує процес за нею лише якщо це не спрацювало, тож запис, який зупиняється сам, ніколи не завершується примусово. Завершення процесу забирає з собою кожну іншу службу, що живе в цьому процесі, незалежно від того, чи зупинилася вона раніше, і попередній перегляд називає їх та називає процес за номером. --force пропускає чемний крок, і тоді попередній перегляд показує один крок замість двох. --restart потім повертає все назад.

Windows пише цю ідею інакше. --force у Stop-Service означає «навіть якщо від неї щось залежить», а це тут робить --dependents. Саме тому це окрема команда, а не параметр stop.

start-type - налаштування, а не дія

Вона каже, що диспетчер робитиме із записом під час наступного завантаження, і без --stop нічого не переміщує: запис, що працює, продовжує працювати, зупинений залишається зупиненим, і план про це каже. disabled - це той, над яким варто замислитися, бо він не дає диспетчеру запускати запис узагалі, зокрема й на вимогу для чогось іншого, що його потребує. delayed - це автоматичний, що запускається трохи пізніше за інші автоматичні записи, - слово, про яке питає start:delayed у запиті, - і Windows відхиляє його для запису в групі порядку завантаження, про що план каже ще до того, як щось станеться. Кожен із чотирьох записує, чи запис запускається пізно, як це робить sc.exe. --stop, лише поруч із disabled, зупиняє запис у тому самому плані після запису налаштування.

snapshot create і snapshot diff

create завжди читає підписи й хеші, бо знімок зберігається й порівнюється пізніше, а знімок без них порівнювався б зі знімком із ними так, ніби машина змінилася. diff каже, що змінилося під час переходу від першого файлу до другого або від файлу до цієї машини з --live. Сторінка про знімки містить формат і міркування.

history - хто змінив, із журналу System

Зміни типу запуску й встановлення з журналу System, найновіші першими, з обліковим записом, який записала Windows. Перший рядок каже, як далеко назад сягає журнал і чи його очищали, бо історія лише така довга, як журнал. З іменем це зміни типу запуску цієї служби - встановлення перелічуються лише без імені, бо Windows записує встановлення під відображуваним іменем, а ніколи під іменем служби. Обліковий запис називається там, де ця машина може назвати його сама, а інакше показується як його SID, а типи запуску подаються словами, які написала Windows.

tool - готові відповіді на поширені проблеми

Ті самі інструменти, які вікно показує на вкладці Tools. bws tool перелічує їх, а bws tool fix перелічує швидкі виправлення: printer, sound, indexing і search, кожне - це перезапуск однієї служби Windows разом із тим, що від неї залежить, вибраний тому, що його пропонують власні сторінки усунення несправностей Microsoft. bws tool fix printer - це рівно bws restart Spooler --dependents: той самий план, той самий вивід і ті самі коди завершення, - і, як кожна команда тут, що щось змінює, вона не питає наперед, тож --dry-run - спосіб подивитися, перш ніж вона запуститься.

license - що всередині завантаженого файлу

Вона не читає взагалі нічого - ні диспетчера служб, ні диска, ні мережі - і відповідає з реєстру, скомпільованого у виконуваний файл. --components перетворює повідомлення на кожен компонент із його версією, ліцензією та походженням. Той самий набір, що несе відомість матеріалів, опублікована поруч із завантаженням, бо обидва будуються з одного реєстру, і саме тому її варто мати: програма - один автономний файл, тож поруч із ним сканеру нічого читати.

Приклади

Плани нижче було перевірено через --dry-run на програмі, яку описує ця сторінка. Команда, що щось змінює, не питає наперед, тож --dry-run - спосіб подивитися, перш ніж вона запуститься. Spooler позначає будь-яку службу - підставте ім'я своєї.

Знайти й прочитати

bws list                                       кожна служба й драйвер на цій машині
bws list --query "start:auto !status:running"  що має працювати й не працює
bws list --query "status:running" --memory     що використовує процес кожного працюючого запису
bws show Spooler                               усе, що відомо про один запис
bws show Spooler --full                        також поля, які справді порожні

Спершу подивитися, потім змінити

bws restart Spooler --dry-run                план і більше нічого
bws restart Spooler --dependents             перезапустити її разом із тим, що від неї залежить
bws stop Spooler --dependents --timeout 120  дозволити дві хвилини на крок без прогресу
bws start-type WSearch delayed --dry-run     запускати її трохи пізніше за інші автоматичні записи
bws start-type Spooler disabled --stop       вимкнути її й зупинити одним планом

Служба, яка не зупиняється

bws kill Spooler --dry-run          процес і кожна служба, що живе в ньому
bws kill Spooler --restart          завершити процес, лише якщо зупинка не вдалася, потім повернути все
bws kill Spooler --force --dry-run  один крок замість двох: процес завершено одразу

Знімки й дрейф

bws snapshot create before.json --note "before the patch"  заморозити машину, з нотаткою всередині
bws snapshot diff before.json after.json                   два файли - два дні або дві машини
bws snapshot diff before.json --live                       файл проти цієї машини такою, як вона є зараз
bws snapshot diff before.json --live --exit-code           те саме, із завершенням кодом 5, якщо конфігурація пішла в дрейф

Хто це змінив

bws history          кожна зміна типу запуску й встановлення, що їх містить журнал System
bws history Spooler  зміни типу запуску однієї служби
bws history --json   те саме як документ, із журналом і змінами

Швидкі виправлення

bws tool                      які є інструменти
bws tool fix                  швидкі виправлення і служба за кожним із них
bws tool fix sound --dry-run  план перезапуску двох аудіослужб
bws tool fix printer          перезапустити Print Spooler разом із тим, що від нього залежить

Що всередині файлу

bws license --components  кожен компонент, його версія, ліцензія й звідки він
bws --version             версія цього виконуваного файлу

У скрипті PowerShell

# записи, які мають працювати й не працюють, як об'єкти
bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status

# непідписані файли, у таблицю
bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation

# що потрібно одній службі
(bws show Spooler --json | ConvertFrom-Json).dependsOn

# нічна перевірка, що розгалужується за кодом завершення
bws snapshot diff C:\baselines\web01.json --live --exit-code > $null
switch ($LASTEXITCODE) {
  0 { 'no configuration drift' }
  5 { 'the configuration drifted' }
  default { "no clean answer, exit code $LASTEXITCODE" }
}

У cmd і пакетному файлі

rem друга команда, лише якщо перша не завершилася чисто
bws restart Spooler || echo the restart did not end cleanly

rem у пакетному файлі з увімкненим відкладеним розгортанням перед ! потрібен знак ^
bws list --query "start:auto ^!status:running"

Параметри

Їх 18. Третій стовпець - команди, до яких належить кожен: параметр, переданий команді, якій він ні до чого, - це помилка з цим списком усередині, а не мовчки проігнорований прапорець.

ПараметрЩо робитьДе працює
--queryЗвужує список за допомогою мови запитів.list
--signaturesЧитає, хто підписав кожен виконуваний файл і чи довіряє йому Windows. На всій машині займає кілька секунд, тому вимкнено, доки не попросять, - а запит про підписи вмикає це сам.list
--memoryЧитає, що використовує процес кожного працюючого запису. За замовчуванням вимкнено, бо це вимірювання, а не налаштування: секундою пізніше воно вже інше.list
--required-byЧитає, які записи зламаються, якщо зупинити один, питаючи безпосередньо в Windows, а не виводячи з того, що всі декларують. Один виклик на запис, тому вимкнено, доки не попросять. show і snapshot create читають це щоразу.list
--follow-networkДозволяє інструменту взагалі виходити за межі цієї машини: шлях запуску, що лежить на чужому спільному ресурсі, і сертифікат, якого ця машина ще не має. За замовчуванням вимкнено задля безпеки: один недоступний спільний ресурс коштує двадцяти однієї секунди й автентифікується як той, хто запустив, а отримання сертифіката - це з'єднання з третьою стороною посеред звичайного списку. Без цього параметра підпис перевіряється за тим, що є тут, а результат, який міг бути спричинений тим, що не дивилися, повідомляється як непрочитаний, а не як вердикт.list, show, snapshot create
--forceУ kill завершує процес одразу, не просячи чемно: попередній перегляд тоді показує один крок замість двох. У snapshot create замінює знімок, який уже існує: файл, що не є знімком, не замінюється ніколи.snapshot create, kill
--restartУ kill повертає запис, коли процесу вже немає, разом з усім, що ділило його.kill
--stopУ start-type і лише поруч із disabled зупиняє запис у тому самому плані після запису налаштування. Тип запуску змінює наступне завантаження і нічого зараз, тому без нього працюючий запис, переведений у disabled, продовжує працювати.start-type
--fullУ show друкує й поля, які справді порожні. Поле, яке ніхто не зміг прочитати, друкується в будь-якому разі.show
--jsonТой самий документ, машиночитаний, у стандартному виводі.list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME
--noteДля чого було зроблено знімок, зберігається всередині файлу.snapshot create
--exit-codeЗавершується кодом 5, коли конфігурація відрізняється: запис додано чи видалено, або один налаштовано інакше. Один лише стан виконання не враховується. За замовчуванням вимкнено, щоб скрипт, якому потрібні лише надруковані відмінності, не спотикався об те, що він їх знайшов.snapshot diff
--liveПорівнює файл із цією машиною в її теперішньому вигляді, а не з другим файлом.snapshot diff
--timingСкільки тривала кожна частина читання, у стандартному потоці помилок.list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME
--dry-runДрукує план і нічого не змінює. Це той самий план, який виконує справжній запуск: другого шляху в коді для справжнього виконання немає.stop, start, restart, start-type, kill, tool fix NAME
--dependentsВносить у план служби, які б зламалися, як окремі кроки.stop, restart, kill
--timeoutСкільки один крок може тривати без прогресу, перш ніж від нього відмовляться, відлік починається заново щоразу, коли служба повідомляє про прогрес. Шістдесят секунд, якщо не скажете іншого. За службою, яка й далі повідомляє про прогрес, спостерігають стільки, скільки потрібно. Вичерпання часу - це кінець спостереження, а не збій, і звіт каже, де запис було залишено.stop, start, restart, kill, tool fix NAME
--componentsУ license перетворює повідомлення на кожен компонент усередині цього виконуваного файлу з його версією, ліцензією та походженням. Той самий набір, що несе відомість матеріалів, опублікована поруч із завантаженням, бо обидва будуються з одного реєстру.license

Коди завершення

Закінчень: 6, і кожне - це окрема дія для скрипта. Дані йдуть у стандартний вивід, а все інше в стандартний потік помилок, тому bws list --json | jq працює, а попередження ніколи не потрапить у ваш JSON.

Кожен документ JSON - звичайний ASCII: літера поза ним записується як шестисимвольна escape-послідовність, яку кожен читач JSON перетворює назад на літеру, тож bws list --json > file.json - це чинний UTF-8, а | ConvertFrom-Json читає його правильно, яка б кодова сторінка не була встановлена в консолі. У тексті, який читає людина, символ, що зсунув би термінал, а не надрукувався - табуляція, розрив рядка, escape-послідовність, перевизначення напрямку, - показується як його кодова точка, <U+001B>.

-- завершує параметри, тож службу, ім'я якої починається з дефіса, все одно можна назвати: bws show -- -odd. Командні рядки, які дає інструмент, написано для PowerShell: ім'я з пробілом береться у подвійні лапки, які cmd читає так само, а ім'я, яке PowerShell розгорнув би всередині них, наприклад MSSQL$SQLEXPRESS, береться в одинарні лапки.

КодЩо означає
0Готово, і все дійшло, куди йшло.
1Інструмент дав збій: він не зміг зробити те, про що його просили, через причину, що стосується самого інструмента, а не плану.
2Командний рядок був неправильним. Для помилково набраної команди пропонується та, яку ви, імовірно, мали на увазі.
3План був добрий, він виконався, і щось у ньому не дійшло, куди йшло: диспетчер відмовив або сеанс не мав на це прав.
4Хтось зупинив виконання вручну. Не нуль, навіть якщо кожен крок усе ж дійшов, щоб обгортка не вважала перерване виконання чистим.
5Порівняння виконалося й виявило, що конфігурація пішла в дрейф: запис додано чи видалено, або один налаштовано інакше. Один лише стан виконання дрейфом не є. Лише з --exit-code, бо дрейф - це те, що цей інструмент створено знаходити, а його знаходження не є збоєм.

Ctrl+C має три рівні, і кожен каже, чого коштує наступний. Перший перестає йти вперед і все одно повертає те, що було взято, другий лишає все як є й усе одно друкує звіт, третій завершує процес. Виконання, зупинене вручну, завершується з 4, навіть якщо кожен крок усе ж дійшов.

Закриття вікна консолі вважається першим Ctrl+C. Windows дає програмі п'ять секунд після цього, і за них вона перестає йти вперед і повертає те, що зупинила. Вихід із системи та вимкнення завершують її без жодного попередження, на яке вона могла б зреагувати, і розірваний віддалений сеанс теж може.

У запланованій задачі

Форма, для якої цей інструмент створено: заморозьте машину, коли вона відома як справна, а потім щоночі питайте, чи вона такою й лишається.

# день, коли машина вводиться в експлуатацію
bws snapshot create C:\baselines\web01.json --note "after the build"

# щоночі, із запланованої задачі
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
#   0 - немає дрейфу конфігурації
#   5 - конфігурація пішла в дрейф, і drift.json каже, що саме
#   3 - виконалося й не змогло прочитати все, тож відповідь часткова

Вікно - це друга половина того самого рушія: BetterWindowsServices-win-x64.zip містить його, а сторінка завантаження каже, що таке кожен архів.

Аргумент вікна

BetterWindowsServices.exe приймає один аргумент, призначений для людини: --catalogue відкриває аркуш розробника, що показує кожен компонент вікна в кожному стані й нічого не читає з вашої машини. Другий, --carry, - це спосіб, у який вікно передає те, що показувало, власній копії, яку воно перезапускає від імені адміністратора. Його ніхто не набирає, і все в ньому, чого це вікно не могло б записати, відхиляється.