2011-07-18 2 views
1

これは私のPowerShellスクリプトです。最後の行にこれを追加することによって、今、私は、ファイルにそれをダンプする場合PowerShell 101:select-objectを使用して予期しない結果がセットコンテンツにパイプされました

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', '', '') 

:これは私がホストに出力し、期待し

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')"; 
} 

:私は意図はかなり明白だと思います:

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

2つの質問:1. PowerShellとは何ですか? 2.ファイル出力をホスト出力のように見えるようにするにはどうすればよいですか?

答えて

2

Select-Objectはオブジェクトを生成します。あなたのスクリプトの場合、scriptblocksを生成しています。ホストに出力すると、出力を生成するためにscriptblockを実行していますが、Set-Contentは実際のscriptblocksを書き込みます。

あなたは(foreachのボディとしてスクリプトブロックを使用して)Foreach-ObjectにパイプにSelect-Objectの出力をスクリプトの一つの小さな部分を変更した場合、それはあなたの所望の出力を生成します。これに

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" 
+0

パーフェクト - あなたに感謝。このスクリプトはあなたの変更に対応しており、私の選択オブジェクトが_scriptblocks_を出力していたことを知っていれば、将来私に役立つでしょう。 – pettys

+0

'select-object'の呼び出しの一部として' {...} 'セクション(スクリプトブロック)があったので、スクリプトブロックを出力していました。それをもっと明確にするために。言い換えれば、scriptblockを与えていたのは、スクリプトブロックブロックを与えたからです。 –

+0

これは理にかなっています.PowerShellが他のオブジェクトと同様にスクリプトブロックを処理できることはわかりませんでした。 :)ありがとうございました。 – pettys

関連する問題