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

时间:2011-07-18 16:24:23

标签: powershell

这是我的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"

my.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...

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

1 个答案:

答案 0 :(得分:2)

Select-Object生成对象。对于您的脚本,它正在生成脚本块。当您输出到主机时,它正在执行脚本块以生成输出,但Set-Content正在编写实际的脚本块。

如果您更改脚本的一小部分以将Select-Object的输出传递给Foreach-Object(使用脚本块作为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"