我试图创建一个可以通过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文件名之外)添加参数的语法。
我在这里甚至在正确的道路上吗?还是有更好的方法呢?
答案 0 :(得分:0)
我不认为您可以像这样传递参数(作为单个字符串),最好使用splatting:
$myInput = @{
Name = $ServiceName
BinaryPathName = '{0} -k netsvc' -f $BinaryPath
StartupType = 'automatic'
DisplayName = $DisplayName
Description = $Description
}
New-Service @myInput