跳到脚本中的某些位置

Aar*_*ron 10 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
Run Code Online (Sandbox Code Playgroud)

mjo*_*nor 12

以下是使用脚本的示例:

$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
Run Code Online (Sandbox Code Playgroud)

使用 .而不是脚本块中的&,以防止它向上走调用堆栈.

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


Ada*_*ski 6

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

或者尝试以下.您可以将命令列表分配给变量,然后使用执行它们&$varname.不过,它仍然没有转到.

$commands = {

    Write-Host "do some work"

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

&$commands 
Run Code Online (Sandbox Code Playgroud)

  • 我想念 goto,它们不只是用于循环。我经常使用它们来根据某些错误或结果进行重定向,而不必离开当前方法。我也同意@TessellatingHeckler,“GoTo”的简单英语似乎比这种新架构更明显。当试图破译别人写的脚本时,更明显可以减少开发时间;谁可能处于或可能不处于不同的技能水平。 (3认同)
  • 我想念它,所以有时我可以快速做事=( (3认同)
  • 这需要非常先进的知识来使用第一类脚本块.意图并不明显或清楚它是一个循环.并且它将消耗资源,直到它达到动态调用深度限制,然后锁定并在某个不可预测的时间抛出异常并停止循环.你确定你喜欢这个设计`:start goto start`? (2认同)