PowerShell 101:使用select-object管道到set-content的意外结果



这是我的powershell脚本;我认为意图很明显:

import-csv .CdmCodeList.csv | select-object -first 3 { 
    $id = $_.ItemDescription.Replace("'", "''");
    $mn = $_.ManufacturerName.Replace("'", "''");
    $mc = $_.ManufacturerCode.Replace("'", "''");
    "insert into @codes values ('$($_.ItemCode)', '$id', '$mn', '$mc')";
}

这是我期望的,输出到主机:

insert into @codes values ('37025012', 'SAW BLADE PROFIX', '', '')                                                                                                                                                                
insert into @codes values ('37067808', 'ROD SUPER FLEX DANEK', '', '')                                                                                                                                                            
insert into @codes values ('52600200', 'GENERATOR PRECISION SCS ADVANCED BIONICS', '', '')   

现在,如果我想通过在最后一行添加以下内容将其转储到文件中:

 | set-content -path "my.sql"

我的。sql不是我想要的,这让我很惊讶:

@{ 
    $id = $_.ItemDescription.Replace("'", "''");
    $mn = $_.ManufacturerName.Replace("'", "''");
    $mc = $_.ManufacturerCode.Replace("'", "''");
    "insert into @codes values ('$($_.ItemCode)', '$id', '$mn', '$mc')";
=insert into @codes values ('37025012', 'SAW BLADE PROFIX', '', '')}
@{ 
    $id = $_.ItemDescription.Replace("'", "''");
    $mn = $_.ManufacturerName.Replace("'", "''");
    $mc = $_.ManufacturerCode.Replace("'", "''");
    "insert into @codes values ('$($_.ItemCode)', '$id', '$mn', '$mc')";
=insert into @codes values ('37067808', 'ROD SUPER FLEX DANEK', '', '')}
...etc...

两个问题:PowerShell在做什么?和2。如何使文件输出看起来像主机输出?

Select-Object生产对象。在脚本的情况下,它正在生成scriptblock。当您输出到host时,它正在执行scriptblocks以产生输出,但是Set-Content正在编写实际的scriptblocks。

如果您更改脚本的一小部分,将Select-Object的输出管道到Foreach-Object(使用scriptblock作为foreach的主体),它将产生您想要的输出。修改第一行的这一部分:

select-object -first 3 {

:

select-object -first 3 | foreach {

你的最终脚本应该是这样的:

import-csv .CdmCodeList.csv | select-object -first 3 | foreach { 
    $id = $_.ItemDescription.Replace("'", "''");
    $mn = $_.ManufacturerName.Replace("'", "''");
    $mc = $_.ManufacturerCode.Replace("'", "''");
    "insert into @codes values ('$($_.ItemCode)', '$id', '$mn', '$mc')";
} | set-content -path "my.sql"

最新更新