명령줄 참조
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는 한 항목에 대해 알려진 모든 것입니다. 서명, 권한, 보안 설명자, 메모리를 모두 매번 읽는데, 항목 하나라면 약 60밀리초가 들지만 컴퓨터 전체라면 1초가 들기 때문입니다. 정말로 비어 있는 필드는 --full을 주지 않으면 생략됩니다. 아무도 읽지 못한 필드는, 생략하면 답처럼 보이므로 어느 쪽이든 출력됩니다.
stop, start, restart
각각 계획을 만들고 실행합니다. --dry-run은 계획만 출력하고 아무것도 바꾸지 않으며, --dependents는 망가질 서비스를 별도의 단계로 계획에 넣고, --timeout은 한 단계가 진행 없이 얼마나 길어질 수 있는지 정합니다. 드라이버는 시도하지 않고 거부됩니다. 커널 드라이버를 중지하면 다시 시작하지 않고는 되돌릴 수 없는 경우가 많기 때문입니다.
kill: 멈추지 않는 서비스를 위해
서비스에 중지를 요청하고, 그것이 통하지 않을 때만 그 뒤의 프로세스를 종료합니다. 따라서 스스로 멈추는 항목은 절대 강제 종료되지 않습니다. 프로세스를 종료하면 그 프로세스 안에 있는 다른 모든 서비스가, 먼저 멈췄는지와 상관없이 함께 사라지며, 미리 보기는 그 서비스들의 이름과 프로세스 번호를 알려 줍니다. --force는 정중한 단계를 건너뛰며, 그러면 미리 보기에 두 단계 대신 한 단계가 표시됩니다. --restart는 나중에 모든 것을 되돌려 놓습니다.
Windows는 이 개념을 다르게 표현합니다. Stop-Service의 --force는 “무언가 종속되어 있더라도”를 뜻하며, 여기서는 --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 진행 없이 단계당 2분까지 허용
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 | 실행 중인 각 항목의 프로세스가 사용하는 것을 읽습니다. 설정이 아니라 측정값이어서 1초 뒤에는 달라지므로 기본값은 꺼짐입니다. | list |
--required-by | 하나를 중지하면 망가지는 항목을 읽습니다. 모두가 선언한 내용에서 추론하지 않고 Windows에 직접 물어봅니다. 항목마다 호출이 한 번씩 필요하므로 요청하지 않으면 꺼져 있습니다. show와 snapshot create는 매번 이를 읽습니다. | list |
--follow-network | 도구가 이 컴퓨터 밖으로 나가는 것을 허용합니다. 다른 사람의 공유에 있는 시작 경로와, 이 컴퓨터에 아직 없는 인증서입니다. 안전을 위해 기본값은 꺼짐입니다. 도달할 수 없는 공유 하나가 21초를 쓰고 실행한 사람으로 인증하며, 인증서를 가져오는 것은 일반적인 목록 한가운데에서 제3자에 연결하는 일이기 때문입니다. 이것이 없으면 서명은 여기에 있는 것을 기준으로 확인되고, 살펴보지 않아서 생겼을 수 있는 결과는 판정이 아니라 읽지 못한 것으로 보고됩니다. | 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 | 한 단계가 진행 없이 포기되기 전까지 얼마나 길어질 수 있는지이며, 서비스가 진행을 보고할 때마다 다시 셉니다. 달리 지정하지 않으면 60초입니다. 진행을 계속 보고하는 서비스는 필요한 만큼 지켜봅니다. 시간 초과는 지켜보기의 끝이지 실패가 아니며, 보고서가 항목이 어디에 남겨졌는지 알려 줍니다. | stop, start, restart, kill, tool fix NAME |
--components | license에서는 알림을 이 실행 파일 안에 있는 모든 구성 요소의 버전, 라이선스, 출처로 바꿉니다. 다운로드 옆에 게시된 자재 명세서가 담은 것과 같은 집합이며, 둘 다 하나의 목록에서 만들어지기 때문입니다. | license |
종료 코드
끝나는 방식은 6가지이며, 각각은 스크립트가 해야 할 서로 다른 일입니다. 데이터는 표준 출력으로, 나머지는 모두 표준 오류로 나가므로 bws list --json | jq가 동작하고 경고가 JSON에 섞이지 않습니다.
모든 JSON 문서는 순수 ASCII입니다. ASCII 밖의 글자는 여섯 글자 이스케이프로 쓰이고 모든 JSON 판독기가 이를 글자로 되돌리므로, bws list --json > file.json은 유효한 UTF-8이고 | ConvertFrom-Json은 콘솔의 코드 페이지가 무엇이든 올바르게 읽습니다. 사람이 읽는 텍스트에서는, 출력되는 대신 터미널을 움직이게 할 글자(탭, 줄 바꿈, 이스케이프 시퀀스, 방향 재정의)가 코드 포인트 <U+001B>로 표시됩니다.
--는 옵션의 끝을 뜻하므로, 이름이 대시로 시작하는 서비스도 bws show -- -odd처럼 지정할 수 있습니다. 도구가 건네주는 명령줄은 PowerShell용으로 작성됩니다. 공백이 있는 이름은 큰따옴표에 넣으며 cmd도 같은 방식으로 읽고, MSSQL$SQLEXPRESS처럼 PowerShell이 큰따옴표 안에서 확장해 버릴 이름은 작은따옴표에 넣습니다.
| 코드 | 의미 |
|---|---|
0 | 완료되었고, 모든 것이 가려던 곳에 도착했습니다. |
1 | 도구가 실패했습니다. 계획이 아니라 도구 자체에 관한 이유로, 요청받은 일을 할 수 없었습니다. |
2 | 명령줄이 잘못되었습니다. 잘못 입력한 명령에는 의도했을 법한 명령이 제안됩니다. |
3 | 계획은 올바랐고 실행되었지만, 그 안의 무언가가 가려던 곳에 도착하지 못했습니다. 서비스 관리자가 거부했거나 세션에 그에 대한 권한이 없었습니다. |
4 | 누군가 실행을 직접 멈췄습니다. 모든 단계가 도착했더라도 0이 아니며, 래퍼가 중단된 실행을 정상으로 취급하지 않도록 하기 위함입니다. |
5 | 비교가 실행되어 구성이 드리프트했음을 발견했습니다. 항목이 추가되거나 제거되었거나, 하나가 다르게 설정되었습니다. 실행 상태만으로는 드리프트가 아닙니다. --exit-code를 줄 때만 해당하는데, 드리프트는 이 도구가 찾아내려고 있는 것이고 그것을 찾는 것은 실패가 아니기 때문입니다. |
Ctrl+C에는 세 단계가 있으며, 각각 다음 단계의 비용을 알려 줍니다. 첫 번째는 앞으로 나아가기를 멈추고 가져간 것을 되돌려 놓으며, 두 번째는 상태를 그대로 두고 보고서를 출력하며, 세 번째는 프로세스를 종료합니다. 수동으로 멈춘 실행은 모든 단계가 도달했더라도 4로 끝납니다.
콘솔 창을 닫는 것은 첫 번째 Ctrl+C로 간주됩니다. 그 뒤 Windows는 프로그램에 5초를 주며, 그동안 이 프로그램은 앞으로 나아가기를 멈추고 내려 둔 것을 되돌려 놓습니다. 로그아웃과 종료는 대응할 수 있는 경고 없이 프로그램을 끝내며, 끊어진 원격 세션도 그럴 수 있습니다.
예약 작업에서
이 도구가 만들어진 이유인 형태입니다. 컴퓨터가 정상이라고 알려져 있을 때 고정하고, 그 뒤 매일 밤 여전히 그런지 묻습니다.
# 컴퓨터가 운영에 들어가는 날
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는 창이 보여 주던 것을, 관리자 권한으로 다시 시작하는 자신의 복사본에 넘기는 방법입니다. 아무도 직접 입력하지 않으며, 그 안에 그 창이 쓸 수 없었을 내용이 있으면 거부됩니다.