PowerShell 101:使用管道传输到集合内容的选择对象时出现意外结果
这是我的powershell脚本;我认为目的很明显:PowerShell 101:使用管道传输到集合内容的选择对象时出现意外结果,powershell,Powershell,这是我的powershell脚本;我认为目的很明显: import-csv .\CdmCodeList.csv | select-object -first 3 { $id = $_.ItemDescription.Replace("'", "''"); $mn = $_.ManufacturerName.Replace("'", "''"); $mc = $_.ManufacturerCode.Replace("'", "''"); "insert into
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——如果你是故意这么做的话,它看起来相当强大。:)非常感谢你的帮助和解释。