Ниже код определяет массив, включая имена служб, которые НЕ нужно останавливать, вместо чтения файла:
# Alternative to array: $servicesNotToStop = Get-Content ..\run.txt
$servicesNotToStop = @("WlanSvc","vpnagent")
Get-Service | ? {$_.Status -eq "Running"} | ? { $servicesNotToStop -notcontains $_.Name} | % { Stop-Service $_ -WhatIf}
Get-Service | ? {$_.Status -eq "Running"}
... Получить все службы в работающем состоянии и отправить их в конвейер.
? { $servicesNotToStop -notcontains $_.Name}
... проверить, не включен ли в массив фактический объект ($_
) в пипелине (тип = ServiceController
) (свойство name
включает имя службы).
% { Stop-Service $_ -WhatIf}
... выполнить остановку службы для каждого объекта, который был предварительно перемещен? -Фильтром. -WhatIf
-переключатель Stop-Service
предотвращает остановку службы, НО выводит, какая служба будет остановлена. Многие командлеты PowerShell предлагают WhatIf
-ключи для проверки команды в "сухом" запуске.
С MSDN :
-WhatIf
Показывает, что произойдет, если командлет запустится. Командлет не выполняется.
ОБНОВЛЕНИЕ 1
Службы чтения, которые не следует останавливать из файла:
$servicesToStop = Get-Content .\dontStop.txt
Get-Service | ? { $_.Status -eq "Running" } | ? { $servicesToStop -notcontains $_.Name } | % { Stop-Service $_ -WhatIf }
Формат файла dontStop.txt:
service1
service2
ОБНОВЛЕНИЕ 2
Более или менее код вашего вопроса:
$ServiceRunName = Get-Service | where-object { $_.Status -eq "Running" } | Select-Object -ExpandProperty Name
$fileServices = Get-Content "..\run.txt"
If ($null -ne $fileServices) {
foreach ($service in $ServiceRunName) {
foreach ($serviceNotToStop in $fileServices ) {
if ($service -ne $serviceNotToStop ) {
Stop-Service $service -WhatIf
break
}
}
}
}
Надеюсь, это поможет