在循环中基于文件名创建数组

时间:2015-04-21 19:43:31

标签: arrays loops powershell

我正在尝试创建用于恢复备份的菜单。 理想情况下,用户将看到一个文件夹列表,每个文件编号,然后提示您选择。列表和选择选项需要是动态的。

问题是我对循环和数组的理解有限。 这是我正在尝试使用的数组:

$saved_backups = Get-ChildItem $backup_folder  |Where-Object {$_.Name -like "*$target_username"} | select-object @{n="Saved Backups:";e={$_.Name}}
[array]::Reverse($saved_backups)

从用户的角度来看,我希望它看起来像:

1) $saved_backups[0]
2) $saved_backups[1]

1) 2015.04.21_laptop
2) 2015.04.20_laptop

备份实际上是文件夹名称。 然后,用户将选择保存到我稍后可以使用的变量的数字和选择。

感谢任何帮助!

编辑#1: 我能够通过以下方式简化所需的文件夹名称:

$saved_backups = Get-ChildItem $backup_folder  |Where-Object {$_.Name -like "*$target_username"}
[array]::Reverse($saved_backups)
$saved_backups = $saved_backups.name
编辑#2:编辑#2: 感谢Matt,我开始理解使用索引的想法。 现在的问题是我的数组,因为它将两个对象都计为一个,然后计算两次。

$saved_backups = Get-ChildItem $backup_folder |Where-Object {$_.Name -like "*$target_username"}
[array]::Reverse($saved_backups)
$saved_backups = $saved_backups.name
For($folderIndex = 1; $folderIndex -le $saved_backups.Count; $folderIndex++){
Write-Host "[$folderIndex]$saved_backups"
}

当前输出:

[1] Folder1 Folder2
[2] Folder1 Folder2

理想情况下,它看起来像:

[1] Folder1
[2] Folder2

一旦我理解了for语句,我就会选择菜单。

2 个答案:

答案 0 :(得分:1)

我刚刚开始使用choice代码。

$backupLocations = get-childitem c:\temp -filter '*data*' | Where-Object{$_.PSIsContainer}

$title = "Backups"
$message = "Please choose a backup location"
$backupLocations.count
$selections = @()
For($folderIndex = 1; $folderIndex -le $backupLocations.Count; $folderIndex++){
    $selections += New-Object System.Management.Automation.Host.ChoiceDescription "&$folderIndex- $($backupLocations[$folderIndex -1].Name)", $backupLocations[$folderIndex -1].FullName
}
$options = [System.Management.Automation.Host.ChoiceDescription[]]($selections)
$result = $host.ui.PromptForChoice($title, $message, $options, 0) 


$backupLocations[$result].FullName

它将提示用户选择上述代码定义的选项。在交互模式下,提示符如下所示。数据和数据2是文件夹名称。

Choice

您的实际问题发挥作用的是循环文件夹并对其进行编号。我将专注于此。

For($folderIndex = 1; $folderIndex -le $backupLocations.Count; $folderIndex++){
    $selections += New-Object System.Management.Automation.Host.ChoiceDescription "&$folderIndex- $($backupLocations[$folderIndex -1].Name)", $backupLocations[$folderIndex -1].FullName
}

因此我们使用索引来逐步执行数组。此索引仅用于我们可以随时计算。对于标识的每个文件夹,我们创建一个选择或选择对象。该对象具有标题和描述。 &符号将数字与选择相关联,因此用户可以像快捷方式一样选择它。在上图中,您会注意到数字下方的下划线。

<强> FYI

对于你的第二次编辑,你很接近。 $saved_backups本身就是一个数组,您也可以将其编入索引。如果您注意到我在我的代码示例中所做的那样。

For($folderIndex = 1; $folderIndex -le $saved_backups.Count; $folderIndex++){
Write-Host "[$folderIndex]$($saved_backups[$folderIndex-1])"
}

在发生之前,$saved_backups的整个列表被转换为字符串,以便输出,这就是你看到重复的原因。

答案 1 :(得分:0)

终于学会了。我的问题是将循环应用于变量中的每个对象,然后搞清楚我需要将计数器/ $ index置于循环之外。生活很艰难,但如果你的愚蠢,那就更难了。 = d

$saved_backups = Get-ChildItem $backup_folder |Where-Object {$_.Name -like "*$target_username"}
[array]::Reverse($saved_backups)
$saved_backups = $saved_backups.name

#This is my answer. The Counter/$Index outside the Loop.
$index = 0
foreach ($element in $saved_backups) {
$index++
Write-Host "[$index]$element"
}

输出:

[1] Folder1
[2] Folder2
PS - 马特将在获得积分后立即获得支持。谢谢你的帮助。