Get-WindowsOptionalFeature 输出中的 RestartRequired 和 RestartNeeded 有什么区别?

问题描述

我运行以下内容

Get-WindowsOptionalFeature -Online -FeatureName TelnetClient | ConvertTo-Json -Depth 100

它产生以下输出

{
    "displayName":  "Telnet Client","Description":  "Allows you to connect to other computers remotely.","Restartrequired":  1,"CustomProperties":  [
                             {
                                 "Name":  "Description","Value":  "Telnet Client uses the Telnet protocol to connect to a remote Telnet server and run applications on that server.","Path":  "ServerComponent"
                             },{
                                 "Name":  "displayName","Value":  "Telnet Client",{
                                 "Name":  "Id","Value":  "44",{
                                 "Name":  "Type","Value":  "Feature",{
                                 "Name":  "UniqueName","Value":  "Telnet-Client",{
                                 "Name":  "Major","Value":  "10","Path":  "ServerComponent\\Version"
                             },{
                                 "Name":  "Minor","Value":  "0",{
                                 "Name":  "Name","Value":  "TelnetClient","Path":  "ServerComponent\\Deploys\\Update"
                             }
                         ],"FeatureName":  "TelnetClient","State":  0,"Path":  null,"Online":  true,"WinPath":  null,"SysDrivePath":  null,"RestartNeeded":  false,"LogPath":  "C:\\Windows\\Logs\\disM\\dism.log","ScratchDirectory":  null,"LogLevel":  2
}

我的问题特别是“RestartNeeded”和“Restartrequired”之间有什么区别?他们俩似乎是关于同一主题的。它们之间究竟有什么区别?

"Restartrequired" 实际上是一个带有值的枚举 (Microsoft.dism.Commands.RestartType):

姓名 价值
没有 0
可能 1
必填 2

(遗憾的是,我仍在使用 PowerShell 5.1,它缺少在 PowerShell 6 和 7 中添加-EnumsAsstringsConvertTo-Json 选项。)

解决方法

简短回答:关于像 TelnetClient 这样返回 [Microsoft.Dism.Commands.AdvancedFeatureObject] 的特征:

  • RestartRequired 表示在安装或启用该功能后是否需要重新启动
  • RestartNeeded 用于显示该功能当前是否正在等待重启。

长版本: AdvancedFeatureObject 类型实际上从未设置过此值。相反,该属性仅由从 Microsoft.Dism.Commands.ImageObject 返回的 Enable/Disable-WindowsOptionalFeature 使用。例如:

# I already have it installed:
Get-WindowsOptionalFeature -Online -FeatureName 'TelnetClient' | fl FeatureName,State,Restart*

FeatureName      : TelnetClient
State            : Enabled
RestartNeeded    : False
RestartRequired  : Possible

# I remove it,and save the output:
$result = Get-WindowsOptionalFeature -Online -FeatureName 'TelnetClient'| 
    Disable-WindowsOptionalFeature

# Returns an ImageObject
($result|gm).TypeName
Microsoft.Dism.Commands.ImageObject

# RestartNeeded is set here
$result

Path          :
Online        : True
RestartNeeded : True

# It does not get set on the main object though (only State=Disabled):

FeatureName     : TelnetClient
State           : Disabled
RestartRequired : Possible
RestartNeeded   : False

我认为 RestartNeeded 属性仅存在于 AdvancedFeatureObject 上,这是由于某种类型继承,实际上并不是一个有用的属性。