将Get-ChildItem的文件名管道传输到.csv文件中

时间:2017-11-06 19:11:03

标签: xml powershell csv

我目前正在编写一个powershell脚本,该脚本将使用xyz.xml查找文件末尾。它解析xml并将所需信息提取到.csv文件中。我还需要.csv文件中xyz.xml文件的名称才能使信息生效。我目前有:

Get-ChildItem -Filter *-xyz.xml | ForEach-Object{
$F_Name = Select-Object Name
[xml]$XYZFILE = Get-Content $_
$TITLE=$XYZFILE.title
$RELEASE=$XYZFILE.release
$VERSION=$XYZFILE.version
$FILEPATH = "INFO.csv"
$FILEEXISTS= Test-Path $FILEPATH
If(FILEEXISTS -eq $False){
$csv = @"
"File Name","Name","Release","Version"
"$F_NAME","$TITLE","$RELEASE","$VERSION"
"@
}
ELSE {
$csv = @"
"$F_NAME","$TITLE","$RELEASE","$VERSION"
"@
}
$csv>>$FILEPATH
}

不幸的是,当我运行这个"文件名"的列时是空的,我不确定为什么。有没有人知道为什么我不能得到我正在解析的文件的实际名称?

1 个答案:

答案 0 :(得分:0)

没有任何内容传递到Select-Object Name。由于您使用的是ForEach-Object,因此您需要管道自动变量$_,其中包含管道中的当前对象。此外,您还需要扩展Name属性,以便不是具有属性名称的对象,而是您的变量将是名称的字符串。

$F_Name = Select-Object Name 

变为:

$F_Name = $_ | Select-Object -ExpandProperty Name

或者您可以使用点属性表示法:

$F_Name = $_.Name

您也可以通过创建对象数组然后使用Export-CSV -Append命令将它们添加到CSV文件来简化脚本。

$FILEPATH = "INFO.csv"
Get-ChildItem -Filter *-xyz.xml |
    ForEach-Object {
        [xml]$XYZFILE = Get-Content $_
        [PSCustomObject]@{
            "File Name" = $_.Name
            "Name" = $XYZFILE.title
            "Release" = $XYZFILE.release
            "Version" = $XYZFILE.version
        }
    } |
    Export-CSV $FILEPATH -Append