Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell 101:使用管道传输到集合内容的选择对象时出现意外结果_Powershell - Fatal编程技术网

PowerShell 101:使用管道传输到集合内容的选择对象时出现意外结果

PowerShell 101:使用管道传输到集合内容的选择对象时出现意外结果,powershell,Powershell,这是我的powershell脚本;我认为目的很明显: import-csv .\CdmCodeList.csv | select-object -first 3 { $id = $_.ItemDescription.Replace("'", "''"); $mn = $_.ManufacturerName.Replace("'", "''"); $mc = $_.ManufacturerCode.Replace("'", "''"); "insert into

这是我的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在干什么?二,。如何使文件输出看起来像主机输出?

选择对象生成对象。对于脚本,它正在生成脚本块。当您输出到主机时,它正在执行scriptblocks以生成输出,但是
Set Content
正在写入实际的scriptblocks

如果将脚本的一小部分更改为将
Select Object
的输出管道化为
Foreach对象
(使用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"

太好了,谢谢。脚本可以与您的修改一起工作,并且知道我的select对象正在输出scriptblocks将在将来帮助我。它正在输出scriptblocks,因为您有
{…}
部分(即脚本块)作为调用
select object
的一部分。我只是想说清楚。换句话说,它之所以给你scriptblock是因为你给了它一个模板scriptblock。这很有意义——我不知道powershell可以像处理任何其他对象一样处理scriptblock——如果你是故意这么做的话,它看起来相当强大。:)非常感谢你的帮助和解释。