我目前正在编写一个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
}
不幸的是,当我运行这个"文件名"的列时是空的,我不确定为什么。有没有人知道为什么我不能得到我正在解析的文件的实际名称?
答案 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