Довідник командного рядка
Кожна команда, кожен параметр і кожен код завершення 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, - це спосіб, у який вікно передає те, що показувало, власній копії, яку воно перезапускає від імені адміністратора. Його ніхто не набирає, і все в ньому, чого це вікно не могло б записати, відхиляється.