我有一个名为c:\ mycommands的文件夹 该文件夹下的文件是多个文件,例如: command1.txt command2.txt command3.txt
每个文件只有一行,如下所示:
在文件command1.txt中:
回声“这是command1”
在command2.txt文件中” 回声“这是command2”
以此类推
我想将文件名及其内容读入数组/变量对中,以构建动态菜单。
所以从理论上讲,我将来要做的就是将文件拖放到文件夹中,程序将动态地将其包含为菜单选项。 (或删除该文件以使其不显示在菜单选项中。
解决此问题的最佳方法是什么?也许将获取内容放入数组中的do while循环?任何投入将不胜感激。我确实在尝试限制或避免菜单维护,但宁愿动态创建菜单bre
答案 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