Powershell读取文件夹下的文件名并读取每个文件内容以创建菜单项

时间:2018-10-08 20:02:11

标签: arrays powershell menu switch-statement

我有一个名为c:\ mycommands的文件夹 该文件夹下的文件是多个文件,例如: command1.txt command2.txt command3.txt

每个文件只有一行,如下所示: 在文件command1.txt中:
回声“这是command1”

在command2.txt文件中” 回声“这是command2”

以此类推

我想将文件名及其内容读入数组/变量对中,以构建动态菜单。

所以从理论上讲,我将来要做的就是将文件拖放到文件夹中,程序将动态地将其包含为菜单选项。 (或删除该文件以使其不显示在菜单选项中。

解决此问题的最佳方法是什么?也许将获取内容放入数组中的do while循环?任何投入将不胜感激。我确实在尝试限制或避免菜单维护,但宁愿动态创建菜单bre

2 个答案:

答案 0 :(得分:1)

在同一基本思想上,有三种变体,具体取决于您需要哪种输出。

# Storing output in a hash table (key/value pairs)
$resultHash = @{}
Get-ChildItem -Path C:\mycommands -File |
    ForEach-Object {$resultHash.Add($_.Name, (Get-Content -Path $_.FullName))}


# Storing output in an array of psobjects
$resultArray = @()
Get-ChildItem -Path C:\mycommands -File | 
    ForEach-Object {
                        $resultArray += (New-Object -TypeName psobject -Property @{"NameOfFile"=$_.Name; "CommandText"=(Get-Content -Path $_.FullName);})
                    }


# Outputting psobjects to the pipeline
Get-ChildItem -Path C:\mycommands -File | 
    ForEach-Object {
                        New-Object -TypeName psobject -Property @{"NameOfFile"=$_.Name; "CommandText"=(Get-Content -Path $_.FullName);}
                }



# Making a nice menu out of the hash table version
$promptTitle = "My menu"
$promptMessage = "Choose from the options below"
$promptOptions = @()
foreach ($key in $resultHash.Keys)
{
    $promptOptions += New-Object System.Management.Automation.Host.ChoiceDescription $key, $resultHash[$key]
}
$promptResponse = $host.ui.PromptForChoice($promptTitle, $promptMessage, $promptOptions, 0) 

答案 1 :(得分:0)

如果我正确地理解了您想要什么,那么也许可以为您完成它。

如果要收集一个文件夹中所有文件的列表,然后从每个文件中获取内容,然后将它们一个接一个地添加到数组中。

[System.Collections.ArrayList]$Files = @(Get-ChildItem "C:\Logs\" | 
    Where-Object {$_.PSIsContainer -eq $false} | 
    Select-Object FullName)
[System.Collections.ArrayList]$List_Of_Commands = @()

foreach ($File in $Files) {
    [System.Collections.ArrayList]$File_Contents = @(Get-Content $File.FullName)

    foreach ($Content in $File_Contents) {
        $Array_Object = [PSCustomObject]@{
            'Command' = $Content
        }
        $List_Of_Commands.Add($Array_Object) | Out-Null
    }
}

$List_Of_Commands