powershell - 代码在 PowerShell 7 和 PowerShell 5.1 中具有不同的结果
问题描述
我有以下代码,它从数据库表中读取数据并查找每一次出现$Search
并将其替换为$Replace
.
$Objects
当变量中只有一个时,我遇到了一些问题PSCustomObject
。正如您在代码的下半部分所看到的,我创建了一个UPDATE
SQL 语句,它在其中迭代找到的对象并创建更新命令。每当那里只有一个对象时,它只取字符串的开头 (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;
可以看到,前两个语句有多个$Object
s,而后四个语句只有一个。
解决方案
推荐阅读
- angular - 从带有 Angular 应用程序链接的服务器打开 .msg 文件
- javascript - 如何在 JSON 中获取价值?
- vba - VBA (API) 将 SOLIDWORKS 工程图另存为 PDF 在设定位置
- database - 如何在聚合期间从另一个数组创建新数组?
- r - 线性回归的循环编程
- php - 单击编辑按钮时,Boostrap 模态不会打开
- django - 如何使用 Graphql 生成的 JWT 来验证我的 rest_framework 视图?
- python - 当列数超过 3 时添加几列的值 - Pandas
- node.js - NestJs Eventbridge Lambda 函数
- typescript - TS Compiler API - 删除分号