在代码部署到EC2实例后如何自动启动(或创建和启动)Windows服务

时间:2018-11-12 21:46:47

标签: powershell amazon-ec2 service aws-code-deploy

我试图创建一个可以通过AWS-CodeDeploy自动部署并在EC2实例上启动Windows服务的管道,但是我无法正确设置Powershell脚本。

我有以下内容:

Appspec.yml

version: 0.0
os: windows
files:
  - source: \
    destination: C:\temp\MyApp
hooks:
  ApplicationStop:
    - location: DeploymentScripts\applicationStop.bat
      timeout: 180
  ApplicationStart:
    - location: DeploymentScripts\applicationStart.bat
      timeout: 180

applicationStart.bat

c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\temp\MyApp\DeploymentScripts\service_create_start.ps1 -ServiceName MyService -BinaryPath 'C:\temp\MyApp\MyService.exe' -DisplayName 'Test Application' -Description 'This is a test'

以及以下Powershell service_create_start.ps1:

Param([Parameter(Mandatory=$true)][string]$ServiceName,[Parameter(Mandatory=$true)][ValidateScript({Test-Path $_ -PathType 'leaf'})][string]$BinaryPath, [string]$Displayname, [string]$Description)

If (Get-Service $ServiceName -ErrorAction SilentlyContinue) {

    If ((Get-Service $ServiceName).Status -eq 'Running') {

        Stop-Service $ServiceName
        Write-Host "Stopping $ServiceName"

    } Else {

        Write-Host "$ServiceName found, but it is not running."

    }

} Else {

    Write-Host "$ServiceName not found. Creating new Windows service."

}

$ArgumentList = '-Name "{0}" -BinaryPathName "{1} -k netsvcs" -DisplayName "{2}" -StartupType Automatic -Description "{3}"' -f $ServiceName, $BinaryPath, $DisplayName, $Description

New-Service $ArgumentList

Start-Service $ServiceName

我创建了bat文件,因为似乎无法从带有参数的代码部署中启动Powershell脚本。我没有其他的束缚。

我的第一个问题是,它挂起了提示“ BinaryPathName”的提示,我觉得这是其中一个文件中的引号引起的问题。

我的第二个问题(如果我在测试中手动输入该问题)是我在“新服务”行中遇到“访问被拒绝”异常。

为解决此问题,我尝试使用RunAs谓词Start-Process来运行增强的Powershell,但是我很难弄清楚使用这种语法在(除了ps1文件名之外)添加参数的语法。

我在这里甚至在正确的道路上吗?还是有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

我不认为您可以像这样传递参数(作为单个字符串),最好使用splatting:

$myInput = @{
    Name = $ServiceName
    BinaryPathName = '{0} -k netsvc' -f $BinaryPath
    StartupType = 'automatic' 
    DisplayName = $DisplayName
    Description = $Description
}
New-Service @myInput

阅读:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-6