将对象从数组传递给函数

时间:2020-09-07 22:31:50

标签: powershell

我正在编写第一个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

1 个答案:

答案 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

我建议通读这些帮助主题。

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parameters?view=powershell-7

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters?view=powershell-7

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions?view=powershell-7

powershell版本7的链接(如果需要5.1),只需更改页面左上角的下拉菜单即可。