Я не кодер и был бы признателен за любую помощь.

Мне нужен командный файл, который будет запрашивать местоположение NAS и производить вывод каталогов верхнего уровня (и, возможно, второго уровня вниз). Структура файла выглядит следующим образом:

\\NAS-ip\home\user1
\\NAS-ip\home\user2
\\NAS-ip\home\user3
\\NAS-ip\home\user4
        ︙
\\NAS-ip\home\user99

Пакетный вывод должен быть:

\\NAS-ip\home\user1,\\NAS-ip\home\user2,\\NAS-ip\home\user3,\\NAS-ip\home\user4 … etc.

1 ответ1

0

Powershell:

Человек читаемый:

(@{Path = '\\NAS-ip\home' ; Levels = '2'} |
    ForEach-Object {
        Get-ChildItem -Path ($_.Path + ((@('\*') * $_.Levels) -join '')) |
            Where-Object {$_.PsIsContainer} | Select-Object -ExpandProperty FullName
    }) -join ','

Один лайнер:

(@{Path = '\\NAS-ip\home' ; Levels = '2'} | ForEach-Object {Get-ChildItem -Path ($_.Path + ((@('\*') * $_.Levels) -join '')) | Where-Object {$_.PsIsContainer} | Select-Object -ExpandProperty FullName}) -join ','

Компактность:

(@{Path = '\\NAS-ip\home' ; Levels = '2'} | % {gci ($_.Path + ((@('\*') * $_.Levels) -join '')) | ? {$_.PsIsContainer} | select -Exp FullName}) -join ','

Измените Path и Levels как считаете нужным. И я советую вам изменить разделитель , чтобы что-то вроде | , потому что запятая разрешена в именах файлов и может привести к неоднозначности. Чтобы изменить разделитель, отредактируйте last -join ',' to -join '|' ,

Бонус: чтобы получить список подкаталогов в нескольких начальных путях, разделите хеш-таблицы в начале запятой:

(@{Path = '\\NAS-ip\home' ; Levels = '2'}, @{Path = '\\NAS2-ip\somedir' ; Levels = '3'} |
    ForEach-Object {
        Get-ChildItem -Path ($_.Path + ((@('\*') * $_.Levels) -join '')) |
            Where-Object {$_.PsIsContainer} | Select-Object -ExpandProperty FullName
    }) -join ','

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .