Я не программист и буду признателен за любую помощь.
Мне нужен пакетный файл, который будет запрашивать местоположение 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
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 ','
на -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 ','