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