代码之家  ›  专栏  ›  技术社区  ›  JohnLBevan

我应该在BoxStarter脚本中包含重新启动命令吗?

  •  4
  • JohnLBevan  · 技术社区  · 9 年前

    问题

    是否有理由包括 if (Test-PendingReboot) { Invoke-Reboot } 在BoxStarter脚本中 $Boxstarter.RebootOk=$true 是否声明?

    出身背景

    我最近发现了BoxStarter,并注意到许多脚本包括以下代码: if(Test PendingReboot){Invoke Reboot} . 这包括具有以下选项的脚本: $Boxstarter.RebootOk=$true $Boxstarter.AutoLogin=$true ; i、 e.允许重新启动并按要求继续的设备。

    BoxStarter site 特此声明如下:

    Boxstarter拦截所有Chocolatey安装命令并检查 等待重新启动。如果检测到挂起的重新启动,Boxstarter将 重新启动计算机并自动将用户重新登录并继续 安装。

    NB:我明白 Invoke-Reboot 有时在进行不会更新PendingReboot标志的更改后可能需要;e、 g.某些注册表更改生效;我的问题纯粹与此命令在包装在 if (Test-PendingReboot) 陈述

    更新:在谷歌群组上也被问到: https://groups.google.com/forum/#!topic/boxstarter/D0kiRqJyiCY

    2 回复  |  直到 9 年前
        1
  •  2
  •   Gary Ewan Park    9 年前

    就我个人而言,我永远不会这样做,不。我依靠Boxstarter为我照看这件事,因为它在内部做同样的检查,所以在我的脚本中另外做是重复工作。

    有时,正如您所提到的,您知道由于某些外部原因需要重新启动,所以我会直接调用InvokeReboot,但这始终会被一些保护子句包围,以防止每次都发生这种情况,因为我始终希望我的脚本可重复。

        2
  •  1
  •   dragon788    8 年前

    我只发现了一个实际需要这样做的案例,就像加里提到的那样,我用一些逻辑来包装它,以避免连续重启。

    我们遇到了这样的情况,即“新创建的”服务器有一些挂起的文件重命名,即使多次重新启动也从未真正消失过,因此如果我们运行Boxstarter,如果我们可以在无限次重新启动之间登录,我们最终不得不尽快关闭cmd窗口。

    生成的脚本可以通过 Install-BoxstarterPackage -DisableReboots <gistUrl> 清理您放入$badFile(您可以列出一个列表)中的任何文件。

    该脚本的一个警告是,它需要交互式提示登录凭据。如果你信任你的系统和网络,你可以使用纯文本密码并组装一个凭证,我想最坏的情况是这样。

    很抱歉,这似乎打破了语法高亮。

    Import-Module $env:appdata\Boxstarter\Boxstarter.Common
    
    $badSpoolReg = '\??\C:\Windows\system32\spool\PRTPROCS\x64\1_hpcpp130.dll'
    $badSpoolFile = 'C:\Windows\system32\spool\PRTPROCS\x64\1_hpcpp130.dll'
    
    # Next bits taken from the 'Get-PendingReboot' module on the Script Gallery.
    $Computer = $env:COMPUTERNAME
    $HKLM = [UInt32] "0x80000002"
    $WMI_Reg = [WMIClass] "\\$Computer\root\default:StdRegProv" 
    
    ## Query PendingFileRenameOperations from the registry 
    $RegSubKeySM = $WMI_Reg.GetMultiStringValue($HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\","PendingFileRenameOperations") 
    #$RegSubKeySM # Debug print of the list if you want to run by hand
    
    $RegValuePFRO = $RegSubKeySM.sValue | where { $_ } # Ignore empty values
    #$RegValuePFRO # Debug print of the list if you want to run by hand
    
    # Credential is required for Create-BoxstarterTask
    # Create-BoxstarterTask required to call Invoke-FromTask
    # see https://github.com/mwrock/boxstarter/issues/121  
    $cred = Get-Credential
    Create-BoxstarterTask $cred
    
    # Perhaps could be improved using set membership comparison?
    # like (if $badSpoolReg in $RegValuePFRO.Values?)
    foreach ($path in $RegValuePFRO) {
        if ($path -contains $badSpoolReg) {
            write-output "Bogey on my six!"
            Get-Service spooler | stop-service
            Invoke-FromTask "rm -fo $badSpoolFile" # Files in "protected" paths require extra work to remove
            $Boxstarter.RebootOk = $true # Need to enable this to allow Invoke-Reboot to work
            Write-output "Took out the bogey, resetting system state"
            Invoke-Reboot # Manually called but within a fairly good gate
        } else {
            write-output "No bogeys sighted Captain!"
        }
    }
    Remove-BoxstarterTask