我正在编写第一个Powershell脚本。这样,我想将ServiceController传递给函数,但是遇到我无法解决的错误。该脚本将停止服务,打开zip文件夹,然后启动服务。
我收到以下无法解决的错误:
Service: Apache24_x86_php56 Running
Set-Service-Status : Cannot process argument transformation on parameter 'svc'. Cannot convert the
"System.Object[]" value of type "System.Object[]" to type "System.ServiceProcess.ServiceController".
At C:\temp\services-change-status.ps1:39 char:26
+ $rv = Set-Service-Status $svc, "Stopped"
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Set-Service-Status], ParameterBindingArgumentTransformationExceptio
n
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Set-Service-Status
脚本:
Add-Type -assembly "system.io.compression.filesystem"
$servicecode = "Apache24_x86_php56"
$servicestatusstart = "Running"
$zipsource = "C:\datafolder"
$zipdestination = "C:\backup\datafolder.zip"
$exitcode = 0
function Set-Service-Status {
param ([System.ServiceProcess.ServiceController]$svc, $status)
Write-Host "Service: $($svc.ServiceName) $status..."
Set-Service -InputObject $svc -Status $status
$svc.WaitForStatus($status, "00:02:00")
$svc.Refresh()
# if service status does not match, return error
if ($svc.Status -ne $status) {
return 1
}
return 0
}
$svcl = Get-Service -Name $servicecode -ErrorAction Stop
if ($svcl.Count -ne 1) {
Write-Host "Invalid service code. $($servicecode)"
exit 1
}
$svc = $svcl[0]
Write-Host "Service: $($svc.ServiceName) $($svc.Status)"
# if service status is Stopped, don't start service at end
if ($svc.Status -eq "Stopped") {
$servicestatusstart = "Stopped"
}
# stop service
$rv = Set-Service-Status $svc, "Stopped"
if ($rv -ne 0) {
Write-Host "Service $($svc.ServiceName) is not Stopped. Status=$($svc.Status)"
exit 2
}
# if zip file exists, delete it
if (Test-Path $zipdestination) {
Remove-Item $zipdestination
}
# zip folder while service stopped
Write-Host "Compressing $($zipsource) to $($zipdestination)..."
[io.compression.zipfile]::CreateFromDirectory($zipsource, $zipdestination)
if (!$?) {
Write-Host "Error compressing folder."
$exitcode = 3
}
# restart service
$rv = Set-Service-Status $svc, $servicestatusstart
if ($rv -ne 0) {
Write-Host "Service $($svc.ServiceName) is not $($servicestatusstart). Status=$($svc.Status)"
$exitcode = 4
}
Write-Host "Service: $($svc.ServiceName) $($svc.Status)"
exit $exitcode
答案 0 :(得分:3)
powershell中的参数由空格而不是逗号分隔。不要与逗号分隔的参数定义混淆。看到这个例子。
import LogoSrc from './logo.png'
export default () => {
return (<img src={LogoSrc} />)
}
输出
Function Test-Params {
Param($first,$second)
Write-Host "First argument is $first" -ForegroundColor Cyan
Write-Host "Second argument is $second" -ForegroundColor Cyan
}
Test-Params a,b
现在,如果我们调用的函数的参数用空格分隔
First argument is a b
Second argument is
输出
Test-Params a b
我建议通读这些帮助主题。
powershell版本7的链接(如果需要5.1),只需更改页面左上角的下拉菜单即可。