0

我在同一网络上有 3 台服务器,并且使用相同的用户名和密码登录,我想在其上执行以下操作:

*Check if Service1 is running or not
*If it is running, stop the service 
*Set Service1 to disable mode 
*If it is not running, do nothing
*Check if Service2 is running 
*If it is running, stop the service 
*Set Service2 to disable mode 
*If it is not running, do nothing

等等 Service3,..4,..5...

我想在第一台服务器上创建一个 Master.bat 文件,它应该在所有 3 台服务器上并行执行上述操作。

我正在尝试下面但没有得到如何在同一代码中为超过 1 个服务执行此操作并且它变得有点冗长。是否有任何其他简短的方法可以批量或 powershell 执行此操作?

original_serverlist.txt:

Server1
Server2
Server3

代码:

copy original_serverlist.txt serverlist.txt

:repeat
set currentserver=
for /f "eol=; tokens=1*" %%i in (serverlist.txt) do set currentserver=%%i
if "%currentserver%"=="" goto end

for /F "tokens=3 delims=: " %%H in ('SC query Service1 ^| findstr "        STATE"') do (
  if /I "%%H" "RUNNING" (
  net stop Service1
  echo Service1 stopped @ %date% %time% > C:\result.txt 
  sc config Service1 start= disabled
  echo Service1 set disabled @ %date% %time% >> C:\result.txt 
  )
)

type serverlist.txt| find /v "%currentserver%"> serverlist1.txt
copy serverlist1.txt serverlist.txt
goto repeat

:end
del serverlist.txt
del serverlist1.txt

编辑1

我在 PS 中不像在批处理中那么舒服,但我想学习这些东西,所以把我的确切要求放在这里,以了解如何在带有代码解释的 powershell 中实现它。

我需要在 Server1 上具有Master.ps1的所有三个并行远程服务器(Server1、Server2、Server3)上执行以下相同的一组操作:

run command  cmd /c iisreset/stop and set IIS service to Disabled mode
Stop service1 and set it to Disabled mode
Stop service2 and set it to Disabled mode
Stop service3 and set it to Disabled mode
Kill process jusched.exe
Kill process conhost.exe
4

1 回答 1

3

在 PowerShell 3.0 中

$services = "service1", "service2", "service3"
"server1", "server2", "server3" | % {
        Get-Service -Computer $_ $services | ? State -eq "Running" | Stop-Service -Force -PassThru | Set-Service -StartupType Disabled
}

如果您当前的域用户没有足够的权限,您需要启用 powreshell 远程处理才能使其工作并-Credential在您看到参数的任何地方添加选项。-Computer

更通用的选择是使用哈希

$ServiceMap = @{ "server1": ("service11", "service12");
                 "server2": ("service21" ... ) }

您还需要检查错误..

要实现并行执行,您可以执行以下操作:

workflow set_services {
  param(
    [string[]]$Computers, [string[]]$Services
  )

  foreach -parallel ($computer in $computers) {
    Get-Service -ComputerName $computer $services | ? State -eq "Running" | Stop-Service -Force -PassThru | Set-Service -StartupType Disabled 
  }    
}

顺便说一句,不要再在任何地方使用批处理脚本。

于 2013-11-09T12:54:19.857 回答