排序文件名和文件夹列表

时间:2017-12-08 19:35:36

标签: powershell

寻找我正在尝试创建的脚本的一些帮助。 我有一个脚本要求用户使用Winforms通过文本框输入一些文本(来自电子邮件)。此电子邮件包含文件和文件夹列表。 我使用一些正则表达式来删除电子邮件中不需要的内容,并留下一个看起来像这样的变量(称为$ results):

$results
file1.zip
graphics\folder1
file2.zip
graphics\folder1
file3.zip
graphics\folder2
etc...

我的想法是,我现在需要:

Extract file1.zip into graphics\folder1
Extract file2.zip into graphics\folder1
Extract file3.zip into graphics\folder2
...and so on.

我现在尝试创建一个自定义PSObject,以便稍后在脚本中调用此列表以将文件部署到正确的路径中。我很难弄清楚如何才能做到这一点。到目前为止,我已经尝试过:

$Object = New-Object -TypeName psobject
$Object | Add-Member -MemberType NoteProperty -Name File -Value $results[0]
$Object | Add-Member -MemberType NoteProperty -Name Path -Value $results[1]
$Object

这给了我一个结果:

File       Path
----       ----
file1.zip  graphics\folder1

当我尝试遍历$ results变量中的每个项目时......

$Object = New-Object -TypeName psobject
forEach ($i in $results) {
$Object | Add-Member -MemberType NoteProperty -Name File -Value $i[0]
$Object | Add-Member -MemberType NoteProperty -Name Path -Value $i[1]
}
$Object

...我收到以下错误:

Add-Member : Cannot add a member with the name "File" because a member with that name already exists. To overwrite the member anyway, add the Force parameter to your command.

我不想重写,我想追加。 问题是我不知道如何告诉PowerShell遍历$ results变量中的每个项目并添加它以便我留下:

File       Path
----       ----
file1.zip  graphics\folder1
file2.zip  graphics\folder1
file3.zip  graphics\folder2

有了这个,最终的结果是我可以在PSObject中获取结果,然后相应地提取文件。

我在这里做错了什么? 也许我说这一切都错了? 非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

根据您的示例,以下是我认为您尝试完成的事情:

设定:

PS C:\> $Results
file1.zip
graphics\folder1
file2.zip
graphics\folder1
file3.zip
graphics\folder2

逻辑:

$Files = @{} #initializes empty hashtable

$tmp = ''
For ($i = 0; $i -le $Results.Count; $i++)
{
    If ($i -eq 0) { $tmp = $Results[$i]; Continue } #initializes tmp value

    If ($i % 2 -eq 0) { $tmp = $Results[$i] }
    Else { $Files["$tmp"] = $Results[$i] }
}

输出:

PS C:\> $Files

Name                           Value
----                           -----
file1.zip                      graphics\folder1
file3.zip                      graphics\folder2
file2.zip                      graphics\folder1

答案 1 :(得分:0)

$Object = forEach ($i in $results) {
    [PSCustomObject]@{
        File = $i[0]
        Path = $i[1]
    } 
}
$Object