gpt4 book ai didi

powershell - Powershell v4-无法捕获XmlDocument Load()方法错误的详细信息

转载 作者:行者123 更新时间:2023-12-03 07:54:02 32 4
gpt4 key购买 nike

目前正在努力了解为什么我的脚本无法按我预期的那样工作,所以我想我会将问题带给您:)

本质上,我正在编写一个程序,该程序将在系统上搜索XML文件并对其进行遍历以找出它们是否格式正确。为此,我将Get-ChildItem查询的输出传递到ForEach-Object语句,并将详细信息记录在ArrayList对象中,以便稍后进行解析。该脚本看起来像这样。

// Variable declaration removed for brevity

Get-ChildItem -Path $dirFilePaths -Include "*.xml" -Recurse | ForEach-Object {
$tmpFile= $_;
$tmpXml= New-Object System.Xml.XmlDocument;

try {
$tmpXml.Load($tmpFile.FullName);
$tmpValues= New-Object PSObject;

$tmpValues | Add-Member -MemberType NoteProperty -Name "File_Name" -Value $tmpFile.Name;
$tmpValues | Add-Member -MemberType NoteProperty -Name "File_Path" -Value $tmpFile.FullName;
$tmpValues | Add-Member -MemberType NoteProperty -Name "File_Status" -Value "OK";

$arlFilesSuccess.Add($tmpValues)
}
catch {
$tmpValues= New-Object PSObject;

$tmpValues | Add-Member -MemberType NoteProperty -Name "File_Name" -Value $tmpFile.Name;
$tmpValues | Add-Member -MemberType NoteProperty -Name "File_Path" -Value $tmpFile.FullName;
$tmpValues | Add-Member -MemberType NoteProperty -Name "File_Status" -Value "NOT OK";
$tmpValues | Add-Member -MemberType NoteProperty -Name "Error_Details" -Value $Error[-1].Exception;

$arlFilesFailure.Add($tmpValues);
}
}

我面临的问题是 $Error变量实际上不包含任何有关由于文件问题导致 $tmpXml.Load()方法失败而导致XML无法加载的信息。例如,如果我在脚本之外将系统上名为“style.xml”的文件调用到$ tmpXml中,则会从PowerShell窗口中收到以下错误消息;
Exception calling "Load" with "1" argument(s): "The 'install-disabled' start tag on line 26 position 3 does not match the end tag of 'install'.
Line 26, position 105."
At line:1 char:1
+ $tmpXml.Load($arlFilesFailure[20].File_Path)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

但是,当我在PowerShell控制台中键入 $Error.count时,由于某种未知的原因,我得到了 0的值。我尝试将 $ErrorActionPreference变量修改为 Stop来强制终止错误;我也尝试将上述脚本写入ScriptBlock中,并使用 Invoke-Command并将 ErrorVariable CommonParameter设置为自定义变量来调用它-仍然无法捕获命令的错误信息,而且我不知道这是怎么回事!

这是否与遇到的异常是 MethodInvocationException并且未归类为终止错误的事实有关?它在Try/Catch语句中被“捕获”,所以它一定是一个终止错误,不是吗?谁能告诉我为什么这些详细信息没有记录在全局 $Error变量中(以及如何检索该信息)?

最佳答案

catch块内部,变量$_表示当前异常(如ErrorRecord)。您不必使用$Error。但是当你必须使用$Error请记住,最近的错误是$Error[0],即第一个
列表。

另外,ForEach-Object可能会导致一些无法清除的错误,请参见一些示例:
PowerShellTraps//Cmdlets/ForEach-Object

关于powershell - Powershell v4-无法捕获XmlDocument Load()方法错误的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35891425/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com