PowerShell 101: неожиданный результат при использовании объекта select, переданного в set-content - PullRequest
1 голос
/ 18 июля 2011

Вот мой сценарий 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 Ответ

2 голосов
/ 18 июля 2011

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...