首页 > 解决方案 > PS 对象转义字符

问题描述

运行代码时出现小错误。我为自定义对象分配了一个字符串,但它自己解析字符串并引发错误。

错误信息

代码:

foreach ($item in $hrdblistofobjects) {
    [string]$content = Get-Content -Path $item
    [string]$content = $content.Replace("[", "").Replace("]", "")
    #here is line 43 which is shown as error as well
    foreach ($object in $listofitemsdb) {
        $result = $content -match $object
        $OurObject = [PSCustomObject]@{
            ObjectName     = $null
            TestObjectName = $null
            Result         = $null
        }
        $OurObject.ObjectName = $item
        $OurObject.TestObjectName = $object #here is line 52 which is other part of error
        $OurObject.Result = $result
        $Resultsdb += $OurObject
    }
}

此代码加载项目并检查项目中是否存在对象。基本上,如果字符串部分存在于字符串部分中,然后将结果保存到变量中。我正在将此代码用于其他对象和项目,但它们没有\p我认为是问题的那部分。出于明显的原因,我不能将 $object 放在单引号中(这是在互联网上建议的,但在我的情况下这是不可能的)。那么还有其他选择如何取消转义\p吗?我试过 $object.Replace("\PMS","\\PMS")了,但这也没有用(这也有人建议过)。

编辑:

$Resultsdb = @(foreach ($item in $hrdblistofobjects) {
        [string]$content = Get-Content -Path $item
        [string]$content = $content.Replace("[", "").Replace("]", "")

        foreach ($object in $listofitemsdb) {
            [PSCustomObject]@{
                ObjectName     = $item
                TestObjectName = $object
                Result         = $content -match $object
            }
        }
    }
)

标签: powershell

解决方案


$Resultsdb未定义为数组,因此当您尝试将一个对象添加到另一个对象但未实现加法运算符时会出现该错误。

无论如何,您不应该在循环中附加到数组。这将表现不佳,因为每次迭代它都会创建一个大小增加一的新数组,复制现有数组中的所有元素,将新元素放入新的空闲槽中,然后用新数组替换原始数组。

更好的方法是只在循环中输出对象并将循环输出收集到一个变量中:

$Resultsdb = foreach ($item in $hrdblistofobjects) {
    ...
    foreach ($object in $listofitemsdb) {
        [PSCustomObject]@{
            ObjectName     = $item
            TestObjectName = $object
            Result         = $content -match $object
        }
    }
}

如果需要确保结果是数组,则在数组子表达式中运行循环,否则当循环返回的结果少于两个时,它将为空或单个对象。

$Resultsdb = @(foreach ($item in $hrdblistofobjects) {
    ...
})

请注意,您需要抑制循环中默认输出流上的其他输出,以免污染您的结果。


推荐阅读