循环遍历powershell中的子文件夹

时间:2015-07-30 15:07:21

标签: xml csv powershell

嗨,我对Powershell很新,但是我设法编写了这个脚本,它完全符合我的要求,但是我必须遍历多个文件夹并想知道它是否完全可能,因为我似乎无法找到一个溶液

cd E:\Project_Data\Data_part1
$files = Get-ChildItem "E:\Project_Data\Data_part1\"*.xml


$MasterArray = @()
$MasterArray = "" | Select Entries
$ConcatEntries = @()
foreach ($file in $files)
{

$MasterArray.Entries += -Join "|$|"

[xml]$XMLfile = gc $file 


$Entries = $XMLfile.InsuranceClaim.InfoFromVet.AnimalClinicalHistory.Entry
$ConcatEntries = @()
foreach ($Entry in $Entries)
{
$ConcatEntries += "E:\Project_Data\Data_part1\"+$file + "|^|" + $Entry.Date
 + "|^|" + $Entry.Time + "|^|" + $Entry.EnteredBy + "|^|" +  $Entry.TextEntry
}

$MasterArray.Entries += $ConcatEntries -Join "|$|"

}

$MasterArray | Export-Csv -NoType "C:\Desktop\out.csv"

您可能会看到它需要输入xml文件的一个节点并将单个重复节点输出到csv文件。我希望实现类似下面的内容但是我不确定如何定义$ folders变量。对不起,如果这有点长,并提前感谢任何建议或帮助。

 foreach($folder in $folders)
 {
 cd $folder
 $files = Get-ChildItem $folder*.xml


 $MasterArray = @()
 $MasterArray = "" | Select Entries
 $ConcatEntries = @()
 foreach ($file in $files)
 {

 $MasterArray.Entries += -Join "|$|"

 [xml]$XMLfile = gc $file 


 $Entries = $XMLfile.InsuranceClaim.InfoFromVet.AnimalClinicalHistory.Entry
 $ConcatEntries = @()
 foreach ($Entry in $Entries)
 {
$ConcatEntries += $folder + $file + "|^|" + $Entry.Date + "|^|" + 
$Entry.Time + "|^|" + $Entry.EnteredBy + "|^|" +  $Entry.TextEntry
 }

 $MasterArray.Entries += $ConcatEntries -Join "|$|"

 $MasterArray | Export-Csv -NoType $folder+"\"+$file+"out.csv"
 }

 }

4 个答案:

答案 0 :(得分:2)

This可能有你需要的......

$folders = [IO.Directory]::GetDirectories("C:\temp","*","AllDirectories")

然后..

 Foreach ($fldr in $folders) {do some stuff}

答案 1 :(得分:1)

您可以使用以下版本来定义$ folders变量:PowerShell 3.0 +:

Get-ChildItem -Path E:\Project_Data -Directory -Recurse

PowerShell 2.0:

Get-ChildItem -Path E:\Project_Data -Recurse | Where-Object {$_.Mode -Match "d"}

答案 2 :(得分:0)

如果文件位于同一目录中,只需将-recurse添加到Get-ChildItem命令,而不是在路径中指定通配符,请使用-Filter开关。

否则,请使用以下内容:

$files+= C:\someotherfolder\*.xml

答案 3 :(得分:0)

我认为您可以帮助您的选项也是添加目录的变量,因此您需要执行以下操作,以替换$Files声明

function get-XMLfromFile{
[CmdletBinding()]
Param
    (
    [string]$Subfolder
    )
$Files = Get-ChildItem -Path "E:\Project_Data\$Subfolder\*.xml" -Recurse

现在最后一行只是我从你回复的上述答案得到的,并且不要忘记在结尾添加另一个},这将使你的脚本成为一个功能。我可以努力让它让你选择要获得的文件夹,如果这会让你走向你想去的方向,但它基本上允许你改变你正在搜索的子文件夹,你不会不需要只更改脚本传递的参数。