Powershell覆盖命令

时间:2014-11-26 14:44:18

标签: loops powershell

我对PowerShell真的很陌生(之前我曾经使用过javascript),我想知道是否有一种方法让PowerShell脚本继续运行,直到用户输入一个特定的命令来覆盖循环并突破它?我已经能够暂停程序以等待响应,但我需要循环继续运行,直到有人输入一个字符串,如"结束。"例如,在下面的代码中,如果用户输入" quit,"那么我想打破while循环并完成一个特定的命令。 "充电器打开,"或"充电器关闭"在任何时候。

$overrideProgram = "null"

$overrideProgram = Read-Host

while ($overrideProgram -ne "quit",$overrideProgram -ne "charger on",$overrideProgram -ne "charger off") {

while ($true) {

$chargeLevel = (Get-WmiObject win32_battery).estimatedChargeRemaining #defining the variable     "chargeLevel" as the charge percentage

if ($chargeLevel -le 40) {chargerOn}

if ($chargeLevel -ge 80) {chargerOff}

Start-Sleep -s 30 # 30 second delay before next check
}
}

非常感谢。

1 个答案:

答案 0 :(得分:1)

我认为这样做的最好方法是启动后台作业并使用脚本来控制该作业的终止:

$job = start-job -scriptblock {
  while ($true) {
    $chargeLevel = (Get-WmiObject win32_battery).estimatedChargeRemaining  #defining the variable "chargeLevel" as the charge percentage
    if ($chargeLevel -le 40) {chargerOff}
    if ($chargeLevel -ge 80) {chargerOn}
    Start-Sleep -s 30 # 30 second delay before next check
  }
}

Write-Host "Background job started with id: $($job.id)" 

$run = $true
while ($run)  {
  $op = Read-Host -Prompt "What ya wanna do?"
  switch($op) {
    "quit" { $run = $false }
    "charger on" { $run = $false }
    "charger off" { $run = $false }
    default { continue }
  }
} 

stop-job $job.id
receive-job $job.id # If you want to see the output
remove-job $job.id

在上面,一个作业启动,然后你的脚本将坐在循环中等待正确的输入。一旦有了,它将退出循环并继续停止并删除开始的作业。

您需要扩展-scriptblock Start-Job参数的内容,以包含chargerOnchargerOff定义。如果脚本相当复杂,最好将其保存到文件中并使用-FilePath的{​​{1}}参数