2016-06-14 3 views
0

Мой скрипт выводит текстовый файл на любых размещаемых веб-сайтах. Текстовый файл будет выглядеть следующим образом:Создать CSV-файл из текстового файла

Default 
Settings 
Layouts 
Stackexchangelogon

мне нужно, чтобы получить эти в CSV файл со следующими заголовками:

  • Тип
  • Base
  • Статус

Для типа, мне нужно имя сайта, база, мне нужно иметь IIS и статус, мне нужно отслеживать.

Конечный результат будет что-то вроде,

Type     Base   Status 
Default    IIS   Monitored 
Settings    IIS   Monitored 
Layouts    IIS   Monitored 
Stackexchangelogon IIS   Monitored

Я искал в Интернете и до сих пор недоумевают, как достичь этого. Он должен работать на PowerShell 2.0 из-за хостов Windows 2003.

Это то, что я до сих пор -

$website = Get-content "D:\Websites.txt" 

$CSV = @() 
$row = New-Object System.Object 
$website | ForEach-Object { 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Type" -Value $_ 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Base" -Value "IIS" 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Status" -Value "Monitored" 

    $CSV += $row 
} 

Но его не добавляя каждый сайт. Я получаю повторы последнего в списке. Результат:

Type       Base       Status 
----       ----       ------ 
Stackexchangelogon   IIS       Monitored 
Stackexchangelogon   IIS       Monitored 
Stackexchangelogon   IIS       Monitored 
Stackexchangelogon   IIS       Monitored

Любые идеи?

ответ

1

код в ваш вопрос не работает, потому что вы создаете $row вне цикла и просто изменить этот один объект внутри цикла. $CSV += $row затем добавляет ссылку к объекту массиву. Из-за этого ваш массив заполняется ссылками на один и тот же объект, а на выходе отображается окончательное состояние этого единственного объекта после цикла.

Есть несколько способов, чтобы избежать этого, например, путем создания нового объекта с каждой итерации (как вы делаете в your own answer), или путем добавления клон объекта в массив:

$CSV += $row.PSObject.Copy() 

Однако оба подхода являются субоптимальными, поскольку они не используют надлежащее использование конвейера. Ваш код можно было бы упростить, используя calculated properties:

Get-Content 'D:\Websites.txt' | 
    Select-Object @{n='Type';e={$_}}, @{n='Base';e={'IIS'}}, 
        @{n='Status';e={'Monitored'}} | 
    Export-Csv 'D:\test.csv' -NoType 
0

Решено с помощью -

$website = Get-content "D:\Websites.txt" 

$CSV = @() 
$website | ForEach-Object { 
    $row = New-Object System.Object 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Type" -Value $_ 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Base" -Value "IIS" 
    $row | Add-Member -MemberType NoteProperty -Force -Name "Status" -Value "Monitored" 

    $CSV += $row 
} 

$CSV | Export-Csv "d:\test.csv" -NoTypeInformation 
Смежные вопросы