代码在PowerShell 7和PowerShell 5.1中具有不同的结果

代码在PowerShell 7和PowerShell 5.1中具有不同的结果,powershell,Powershell,我有以下代码,它从数据库表中读取数据,查找$Search的每一次出现,并将其替换为$Replace 当$Objects变量中只有一个PSCustomObject时,我遇到了一些问题。正如您在代码的下半部分中所看到的,我创建了一个UPDATESQL语句,它在其中迭代找到的对象并创建UPDATE命令。只要其中只有一个对象,它就只取字符串的开头(在$Objects.Column[$\u])而不是整个值。我通过简单地检查变量中是否只有一个对象或是否有多个对象来创建一个变通方法 现在,这在PSCore中起

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


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

现在,这在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
    }
}
下面是PowerShell 7的
$Updates
的部分输出:

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;

您可以看到,前两条语句有多个
$Object
s,而下四条语句只有一个。

$Objects.Column[$\u]
使用了自PowerShell 3以来引入的一种技术。在早期版本中,您将需要使用以下内容。如果它与Windows PowerShell 3或更高版本有关,请尝试:
@($Objects.Column)[$\u]
,以确保单例不会以字符串结束。