【问题标题】:PowerShell giving an error "Object reference not set to an instance object"PowerShell 给出错误“对象引用未设置为实例对象”
【发布时间】:2020-06-12 17:15:23
【问题描述】:

每次运行时,我的 powershell 脚本都会收到错误消息。但是,它确实运行成功。我想知道是什么导致了错误信息。谢谢!

PowerShell:

 [xml]$file = get-content "c:\Windows\personalsettings\PersonalSettings.xml"
  $xmlProperties = $file.SelectNodes("/Objects/Object/Property")
   If ($xmlProperties.Where({ $_.InnerText -eq 'FireFox' }, 'First'))
    {
    Invoke-expression "C:\Windows\SetDefaultBrowser\setdefaultbrowser"
  }
   If ($xmlProperties.Where({ $_.InnerText -eq 'Chrome' }, 'First'))
  { 
  Invoke-expression "C:\Windows\psu\protected\SetDefaultBrowser\setdefaultbrowser"
 }

XML 文件:

<?xml version="1.0"?>
<Objects>
<Object>
<Property Name="Browser">Firefox</Property>
<Property Name="PDF">Adobe Reader</Property>
</Object>
</Objects>

【问题讨论】:

  • 那么......你得到的错误是什么?
  • @Lee_Dailey 你可以在标题中看到错误。
  • 我怀疑您的错误出在您调用的文件之一中(这部分工作正常)。
  • 请分享完整的错误信息
  • 您需要发布整个错误消息的全文。另外,关于问题的所有信息都需要在帖子中,而不是零散地散落在各处。

标签: xml powershell scripting


【解决方案1】:

xml 文件使用命名空间 &lt;?xml version="1.0"?&gt; 声明,这就是它不选择节点的原因。像普通对象一样获取值会更好:

$file = [xml](Get-Content "c:\Windows\personalsettings\PersonalSettings.xml")
$file.objects.object.property | ForEach {
  If ($_.Innertext -eq "Firefox") {
    Invoke-expression "C:\Windows\SetDefaultBrowser\setdefaultbrowser"
  }
  If ($_.Innertext -eq "Chrome") {
    Invoke-expression "C:\Windows\psu\protected\SetDefaultBrowser\setdefaultbrowser"
  }
}

【讨论】:

  • 节点选择得很好(即使是&lt;?xml version="1.0"?&gt;
  • @iRon 你确定吗?我发布了一个与节点选择类似的答案问题。由于它没有声明命名空间,所以它不起作用。但是在添加命名空间后它起作用了。甚至像这样的方法也有效。 Invoke-Expression ... 仍然可能是一个问题,因为调用的文件没有任何扩展名,所以这甚至可能是一个问题。感谢您的观察。
  • 现在效果更好了。多谢你们。只是一个额外的问题。您将如何更新“Firefox”的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2011-07-09
  • 2012-08-31
  • 2011-11-21
  • 2012-10-01
  • 1970-01-01
相关资源
最近更新 更多