有没有办法让脚本跳转到特定的位置,如:命令提示符中的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
答案 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
。除非你需要别的东西。