跳到脚本中的某些位置

时间:2013-11-26 15:42:19

标签: powershell

有没有办法让脚本跳转到特定的位置,如:命令提示符中的GOTO?我希望脚本在结束时跳转到开头。

$tag1 = Read-Host 'Enter tag #'

cls

sc.exe \\$tag1 start RemoteRegistry

cls

Start-Sleep -s 2

cls

systeminfo /S $tag1 | findstr /B /C:"OS Name" /C:"System Boot Time" /C:"System Up Time";


Get-EventLog system -computername $tag1 -InstanceId 2147489657 -Newest 10 | ft EventID,TimeWritten,MachineName -AutoSize

Pause

3 个答案:

答案 0 :(得分:11)

以下是使用您的脚本的示例:

$GetInfo = {
  $tag1 = Read-Host 'Enter tag # or Q to quit'
  if ($tag1 -eq 'Q'){Return}
  cls
  sc.exe \\$tag1 start RemoteRegistry
  cls
  Start-Sleep -s 2
  cls
  systeminfo /S $tag1 | findstr /B /C:"OS Name" /C:"System Boot Time" /C:"System Up Time"
  Get-EventLog system -computername $tag1 -InstanceId 2147489657 -Newest 10 |
    ft EventID,TimeWritten,MachineName -AutoSize
  .$GetInfo
 }

&$GetInfo

使用。而不是&在脚本块内部,以防止它向上移动调用堆栈。

将代码放入脚本块中以便稍后从脚本中的任意点调用(模拟GoTo)在功能上与使用函数相同,并且以这种方式使用的脚本块有时被称为“匿名函数”。

答案 1 :(得分:6)

PowerShell中没有goto,没有人错过它:)。只需将命令块包装在一个循环或其他东西中。

或者尝试下面的内容。您可以将命令列表分配给变量,然后使用&$varname执行它们。但它仍然没有转到。

$commands = {

    Write-Host "do some work"

    $again = Read-Host "again?"
    if ($again -eq "y"){
        &$commands
    } else {
        Write-Host "end"    
    }
}

&$commands 

答案 2 :(得分:3)

脚本的另一个变体是从@mjolinor获取的一些想法。我也没有使用systeminfo,因为至少在我的计算机上,它比使用适用的WMI查询慢

while (1) {
    $tag1 = Read-Host 'Enter tag # or Q to quit'
    if ($tag1 -eq "Q") {
        break;
    }
    sc.exe \\$tag1 start RemoteRegistry;
    start-sleep -seconds 2
    $OSInfo = get-wmiobject -class win32_operatingsystem -computername $tag1;
    $OSInfo | Format-Table -Property @{Name="OS Name";Expression={$_.Caption}},@{Name="System Boot Time";Expression={$_.ConvertToDateTime($_.LastBootUpTime)}},@{Name="System Uptime (Days)";Expression={[math]::Round((New-TimeSpan -Start $_.converttodatetime($_.LastBootUpTime)|select-object -expandproperty totaldays),2)}} -AutoSize;
    Get-EventLog system -computername $tag1 -InstanceId 2147489657 -Newest 10 | format-table EventID,TimeWritten,MachineName -AutoSize
}

我不确定WMI是否需要远程注册表,因此您可以完全删除sc.exe行和sleep。除非你需要别的东西。