Как вы положили список каталогов в список - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать скрипт Powershell, который будет искать в указанной папке и перечислять все подпапки в списке.Когда пользователь выбирает папку из списка, выполняется действие.

Я довольно новичок в PowerShell, поэтому я не знаю, нахожусь ли я на правильном пути, но я попытался поместить каталог в массив, я просто не знаю, как получить массив всписок.

$items = Get-ChildItem -Path $path


foreach ($item in $items)

{

  # if the item is a directory, then process it.

  if ($item.Attributes -eq "Directory")

  {

        Write-Host $item.Name

  }

}

1 Ответ

1 голос
/ 21 сентября 2019

Для демонстрации, вот простая форма, которая заполняет список путями к подпапкам.

$rootFolder = 'PATH TO YOUR ROOTFOLDER HERE'

# get an array of subfolder full names in the $rootFolder
$subfolders = (Get-ChildItem -Path $rootFolder -Recurse -Directory).FullName

Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form 
$form.Text = "SubFolders"
$form.Size = New-Object System.Drawing.Size(300,300) 
$form.StartPosition = "CenterScreen"

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40) 
$listBox.Size = New-Object System.Drawing.Size(260,180)
$listBox.Anchor = 'Top,Right,Bottom,Left' 

# fill the listbox with subfolder names
$listBox.items.AddRange($subfolders)

# add an event handler on the listbox to do something with the selected item
$listBox.Add_Click({
    # here put your code to perform some action with the selected subfolder
    $selected = $listBox.GetItemText($listBox.SelectedItem)
    # for demo, simply show a messagebox
    [System.Windows.Forms.MessageBox]::Show("You selected subfolder`r`n`r`n$selected", "Subfolder")
})

$form.Controls.Add($listBox) 

$form.ShowDialog()
$form.Dispose()


Обновление

Согласно вашему комментарию, вы быхотел бы добавить второй столбец в список, в котором отображается дата LastWriteTime (lastModified).

Предыдущий код может быть довольно легко адаптирован для добавления строковых элементов, которые являются комбинацией папки FullNames в сочетании с LastWriteTimeиспользуя какой-то символ разделения.Позже, разделите выделенный элемент на этого персонажа, чтобы получить только имя.

Однако, для удобства пользователя, это может привести к путанице.
Добавление нового столбца было бы лучше, но хотя объект Listbox действительно имеет свойство MultiColumn, результат использования этого, скорее всего, NOT того, что вы ожидаете.

Ниже обновленного кода для использования нескольких столбцов в ListView объект вместо ListBox.

$rootFolder = 'PATH TO YOUR ROOTFOLDER HERE'

# get an array of subfolder objects in the $rootFolder
$subfolders = Get-ChildItem -Path $rootFolder -Recurse -Directory

Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form 
$form.Text = "SubFolders"
$form.Size = New-Object System.Drawing.Size(600,400) 
$form.StartPosition = "CenterScreen"

$listView = New-Object System.Windows.Forms.ListView
$listView.Location = New-Object System.Drawing.Point(10,40) 
$listView.Size = New-Object System.Drawing.Size(560,280) 
$listView.Anchor = 'Top,Right,Bottom,Left'
$listView.View = 'Details'
$listView.FullRowSelect = $true
$listView.GridLines = $true

[void]$listView.Columns.Add("Folder", 338);
[void]$listView.Columns.Add("LastModified", 200);
# fill the listbox with subfolder names and Last Modified dates
$subfolders | ForEach-Object {
    $row = New-Object System.Windows.Forms.ListViewItem( $_.FullName)  # the folder path goes into the first column
    [void]$row.SubItems.Add($_.LastWriteTime.Tostring())               # the LastWriteTime goes into the second column
    [void]$listView.Items.Add($row)
}

# add an event handler on the listbox to do something with the selected item
$listView.Add_Click({
    # here put your code to perform some action with the selected subfolder
    $selected = $listView.SelectedItems[0].Text
    # for demo, simply show a messagebox
    [System.Windows.Forms.MessageBox]::Show("You selected subfolder`r`n`r`n$selected", "Subfolder")
})

$form.Controls.Add($listView) 

[void]$form.ShowDialog()
$form.Dispose()

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...