首页 > 解决方案 > 代码在 PowerShell 7 和 PowerShell 5.1 中具有不同的结果

问题描述

我有以下代码,它从数据库表中读取数据并查找每一次出现$Search并将其替换为$Replace.

$Objects当变量中只有一个时,我遇到了一些问题PSCustomObject。正如您在代码的下半部分所看到的,我创建了一个UPDATESQL 语句,它在其中迭代找到的对象并创建更新命令。每当那里只有一个对象时,它只取字符串的开头 (at $Objects.Column[$_]) 而不是整个值。我通过简单地检查变量中是否只有一个或多个对象来创建一种解决方法。

现在这在 PSCore 中有效,但是在 Windows PowerShell 中,解决方法不起作用。为什么?

这是代码:

$GetQuery = "SELECT * FROM SML_DATA"
$GetData = Invoke-Sqlcmd @SqlSplat -Query $GetQuery | 
Select-Object * -ExcludeProperty $Exclude

$Updates = @()
foreach ($Obj in $GetData) {
    $Objects = @()
    $Objects = foreach ($Property in $Obj.PSObject.Properties) {
        if ($Property.Value -like $SearchFor) {
            [PSCustomObject]@{
                Column = $Property.Name -join ''
                Value  = ($Property.Value -join '').replace($Search, $Replace)
            }
        }
    } 
    if ($Objects) {
       $Query = "UPDATE SML_DATA SET"
       if ($Objects.count -eq 1) {
            $Query = $Query + " " + $Objects.Column + " = " + "'" + $Objects.Value + "'"
       }
       else {
           0..($Objects.Count - 1) | ForEach-Object {
               $Query = $Query + " " + $Objects.Column[$_] + " = " + "'" + $Objects.Value[$_] + "'"
               if (![string]::IsNullOrEmpty($Objects.Column[$_ + 1])) { $Query = $Query + "," }
           }
       }
       $Query = $Query + " WHERE ID = $($Obj.ID);"
       $Updates += $Query
    }
}

$Updates这是 PowerShell 7的部分输出:

UPDATE SML_DATA SET ArtBeschrieb1_3 = 'Verdi Lackfront, matt beidseitig matt lackiert 19 mm, Kanten R2 mm, Sonderf.', SMW1 = 'Verdi', ArtBeschrieb1_2FR = 'Verdi face laqué mat face et contreface laqué mat 19 mm, avec radius 2 mm' WHERE ID 
= 4317;
UPDATE SML_DATA SET ArtBeschrieb1_3 = 'Verdi Front matt lackiert 19 mm m2 - Preis PK 1', SMW1 = 'Verdi;', ArtBeschrieb1_2FR = 'Verdi Front matt lackiert  m2- Preis PK 1' WHERE ID = 4321;
UPDATE SML_DATA SET SMW34 = 'Verdi;Verdi Top;Velino;Helios;Valance;Verdi Wiki;Verdi Wikitu;Verdi Luron;Verdi Telvo;Quadretto;Kadra 90;Kadra 10;Berlioz;Lineta;' WHERE ID = 4477;
UPDATE SML_DATA SET SMW34 = 'Verdi;Verdi Top;Velino;Helios;Valance;Verdi Wiki;Verdi Wikitu;Verdi Luron;Verdi Telvo;Quadretto;Kadra 90;Kadra 10;Berlioz;Lineta;' WHERE ID = 4478;
UPDATE SML_DATA SET SMW34 = 'Verdi;Verdi Top;Velino;Helios;Verdi Wiki;Verdi Wikitu;Verdi Luron;Verdi Telvo;Berlioz;Lineta;' WHERE ID = 4479;
UPDATE SML_DATA SET SMW34 = 'Verdi;Verdi Top;Velino;Helios;Verdi Wiki;Verdi Wikitu;Verdi Luron;Verdi Telvo;Berlioz;Lineta;' WHERE ID = 4480;

这是 Windows PowerShell 5.1 中的相同部分:

UPDATE SML_DATA SET ArtBeschrieb1_3 = 'Verdi Lackfront, matt beidseitig matt lackiert 19 mm, Kanten R2 mm, Sonderf.', SMW1 = 'Verdi', ArtBeschrieb1_2FR = 'Verdi face laqué mat face et contreface laqué mat 19 mm, avec radius 2 mm' WHERE ID 
= 4317;
UPDATE SML_DATA SET ArtBeschrieb1_3 = 'Verdi Front matt lackiert 19 mm m2 - Preis PK 1', SMW1 = 'Verdi;', ArtBeschrieb1_2FR = 'Verdi Front matt lackiert  m2- Preis PK 1' WHERE ID = 4321;
UPDATE SML_DATA SET S = 'V', 4 = ';', WHERE ID = 4477;
UPDATE SML_DATA SET S = 'V', 4 = ';', WHERE ID = 4478;
UPDATE SML_DATA SET S = 'V', 4 = ';', WHERE ID = 4479;
UPDATE SML_DATA SET S = 'V', 4 = ';', WHERE ID = 4480;

可以看到,前两个语句有多个$Objects,而后四个语句只有一个。

标签: powershell

解决方案


推荐阅读