PS对象不转义字符

时间:2019-09-17 08:41:27

标签: powershell

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

error msg

代码:

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放在单引号中(这是在Internet上建议的,但在我看来,这是不可能的)。那么,还有没有其他选择可以对\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
            }
        }
    }
)

2 个答案:

答案 0 :(得分:0)

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

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

更好的方法是只在循环中输出对象,然后将循环输出收集到变量中:

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

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

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

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

答案 1 :(得分:0)

我将匹配部分更改为此,$result = $content -match $object.Replace("\PMS","\\PMS")正常工作。

很抱歉发布错误。我将对此进行修改。