【问题标题】:Powershell to start/stop with argPowershell 使用 arg 启动/停止
【发布时间】:2018-07-24 14:09:15
【问题描述】:

我在 test.ps1 中编写了以下函数,我想在运行 thsi 脚本启动/停止/..时做出选择:

function getState($SeviceName) { 
    $server = @('host_1', 'host_2')

    # get status 
    $server | % {Write-Host "verify: $_"; Get-Service -ComputerName $_ -Name SeviceName
}
  1. 我想提供$ServiceName 作为参数(带标准输入)我该怎么做? => 类似选择 1 开始 2 停止 ...
  2. 在 Powershell 中使用 switch/case

    $doAction = {"Stop-Service", "Start-service"}
    $server | % {Write-Host "verify: $_"; Get-Service -ComputerName $_ -Name SeviceName | $doAction}
    

如何使用开关选择开始或停止?

【问题讨论】:

  • -Name SeviceName -> -Name $SeviceName

标签: powershell


【解决方案1】:

这是一个可以满足您要求的功能:

function Get-State {
    [CmdletBinding()]
    [OutputType('System.ServiceProcess.ServiceController')]
    param(
        [Parameter(Position = 0, Mandatory)]
        [ValidateSet('Start', 'Stop', 'Get')]
        [string] $Action,

        [Parameter(Position = 1, ValueFromPipeline, Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string] $ServiceName
    )

    begin {
        $serverList = @('host_1', 'host_2')
    }

    process {
        foreach ($server in $serverList) {
            try {
                $svc = Get-Service -ComputerName $server -Name $ServiceName -ErrorAction Stop
            } catch {
                throw "Failed to find service $ServiceName on $server! $PSItem"
            }

            switch ($Action) {
                'Start' { $svc | Start-Service -PassThru }
                'Stop'  { $svc | Stop-Service -Force -PassThru }
                default { $svc }
            }
        }
    }
}

它利用高级功能特性和属性来获取管道输入(用您的话来说是stdin)。我建议reading this documentation.

【讨论】:

  • @Lika 我忘了在我的示例中添加process{}。它现在应该可以按预期工作了。
  • @TheIncorrrigible :对不起,我不熟悉其他语言中的 powershell,我们调用带有或不带 arg 的脚本,在这里,如果我尝试调用 test.ps,它不会返回任何内容,而我我希望被要求提供 arg
  • @Lika 我现在向$ServiceName 添加了一个Mandatory 属性,因此如果您不带参数执行它,应该会收到提示。
  • 运行我只需要调用包含这个函数的 .\test.ps1 对吗?因为正如我所说,它不会返回任何东西
  • @Lika 不,您需要在定义} Get-State 后调用该函数。如果您想这样称呼它,请将内容保存到一个没有function ... { 和结尾} 的文件中。我再次更新了它,所以它会提示您输入服务名称和要采取的操作。该操作可以通过制表符完成。
【解决方案2】:

您可以通过向脚本添加参数来向脚本添加参数。 在脚本文件的顶部放置:

Param
(
    [parameter()]
    [String[]]$YourArgumentVariable

    [parameter()]
    [switch] $MySwitch
)

对于函数,它紧跟在函数定义之后。所以在你的情况下:

function getState($SeviceName) { 
    Param
    (
        [parameter()]
        [String[]]$server

        [parameter()]
        [switch] $MySwitch
    )
    # get status 
    $server | % {Write-Host "verify: $_"; Get-Service -ComputerName $_ -Name SeviceName
}

开关基本上将布尔值设置为真或假。 因此,如果您使用 -MySwitch 调用脚本,它会将变量 $MySwitch 设置为 true。否则它将保持错误。

Don Jones 写了一封 good getting started article on paramters,我建议您查看一下。

请注意,您可以在参数中定义很多东西。就像如果你想确保它总是被填满,你可以设置

 [parameter(Mandatory=$true)]

这只是您可以使用参数执行的众多示例之一。

【讨论】:

  • 你可能想要重写你的演示函数getState,因为那里有很多语法错误/错别字..
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多