0

我有看起来类似于以下内容的 xml

<Settings>
    <CentralOnly>
        <DateLists>
            <DateList Name="name1" ID="1">
                <Date>*-01-01</Date>
                <Date>*-12-25</Date>
                <Date>2007-05-28</Date>
                <Date>2007-09-03</Date>
            </DateList>
            <DateList Name="name2" ID="2">
                <Date>2008-11-11</Date>
                <Date>2008-11-27</Date>
            </DateList>
            <DateList Name="name3" ID="3">
                <Date>2008-03-21</Date>
                <Date>2010-04-02</Date>
            </DateList>
        </DateLists>
    </CentralOnly>
</Settings>

最终目标是将其放入 sql server 2008 r2 数据库中。我目前这样做的模式(很差)是将每一列写入一个单独的文本文件

dateID.txt   |  specificDate.txt
    1        |     *-01-01
    1        |     *-12-25
    1        |     2007-05-28
    1        |     2007-09-03
    2        |     2008-11-11
    2        |     2008-11-27
    3        |     2008-03-21
    2        |     2010-04-02

我相信下面的代码以这种方式在正确的轨道上(它还不起作用)。但是必须有一种方法可以用一个文件来做到这一点,也许是一个csv?

set-executionpolicy unrestricted
[xml]$config = Get-Content c:\path\config.xml
new-item c:\path\dlDays.txt -type file -force
new-item c:\path\dlDLID.txt -type file -force
$xml = $config.settings.DateLists.DateList | % $_.DateList{
    $dateID = $_.id
    $eachDate = $_.date | % $_.date{
        $specificDate = $_.date
        add-content c:\path\dlDays.txt $specificDate
        add-content c:\path\dlDLID.txt $dateID
    }
}
4

2 回答 2

3

#12:输出对象

我使用了您的 XML 文件,而不是输出到两个文件,而是创建了一个对象数组。然后我只是将这些对象通过管道传输到 Export-Csv。

[xml]$config = Get-Content date.xml
$newdlist = @()
foreach($dlist in $config.Settings.CentralOnly.DateLists.DateList){
    $dateID = $dlist.ID
    foreach($date in $dlist.Date){
        $newdlist += @(New-Object -TypeName psobject -Property @{'ID'=$dateID;'Date'=$date})
    }
}
$newdlist | Export-Csv -Path dat.csv

现在,如果您想再次使用 $newdlist,您只需使用 Import-Csv 导入 Csv 文件。

PS C:\> $data = Import-Csv date.csv
PS C:\> $data

ID                                                          Date
--                                                          ----
1                                                           *-01-01
1                                                           *-12-25
1                                                           2007-05-28
1                                                           2007-09-03
2                                                           2008-11-11
2                                                           2008-11-27
3                                                           2008-03-21
3                                                           2010-04-02

我不知道如何将 SQL 与 powershell 一起使用,但现在使用数据更容易。

$data | % {"INSERT '$($_.Date)' INTO 'Id' Where 'Id'='$($_.ID)'"}

更多的

CSV 文件如下所示:

#TYPE System.Management.Automation.PSCustomObject
"ID","Date"
"1","*-01-01"
"1","*-12-25"
"1","2007-05-28"
"1","2007-09-03"
"2","2008-11-11"
"2","2008-11-27"
"3","2008-03-21"
"3","2010-04-02"
于 2013-04-01T22:21:33.847 回答
1

这是我用来生成 csv 文件的内容:

[xml]$xml = Get-Content -path "c:\temp\datedata.xml"

$nodes = $xml.Settings.CentralOnly.DateLists.DateList

$array = @()

foreach ($node in $nodes) {

    $id = $node.ID

    foreach ($date in $node.Date) {

        $entry = New-Object PSObject -property @{
            ID = $id
            Date = $date
        }

        $array += $entry
    }

}

$array | Export-Csv -Path 'c:\Temp\data.csv' -Delimiter ',' -noTypeInformation

注意:您需要使用 -noTypeInformation 从 csv 文件中排除类型。

于 2013-04-01T22:58:13.700 回答