2013-03-12 4 views
1

У меня есть несколько компьютеров, загружающих файлы в один каталог FTP. Первая часть имени файла - это машина, остальная - временная метка, например. AAAAA_20130312_125113.Список уникальных частей файла filename

Теперь я хочу получить отсортированный список всех уникальных машин, загруженных в этот каталог. Мне удалось записать потерянный из всех filenames.substring (0,5) на хост, но у меня все еще нет уникальных имен машин.

$files=Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse 
ForEach ($i in $files) { Write-Host $i.Substring(0,5) } 

Любые подсказки о том, как это сделать? Не обязательно, чтобы был один лайнер, хотя это было бы неплохой задачей ;-).

Спасибо!

ответ

5

Что произойдет, если у вас есть 8-значное имя машины? Ваш substring сломается. Поскольку имя машины, дата & время ограничено _, поделитесь этим, что & получите первый товар.

Get-ChildItem $strMOVETO -recurse -name -include TAS*.csv|%{$_.split("_")[0]|sort-object -unique 

Для фильтрации по дате, а также:

Get-ChildItem $strMOVETO -recurse -include TAS*.csv|where-object{$_.lastwritetime -ge (get-date).adddays(-1)}|%{$_.basename.split("_")[1]|sort-object -unique 
+0

Длина имени машины действительно является переменной. Предполагая, что [1] вместо [0] возьмет второй элемент (TAS_xxxxxxxx, как в Фильтре), поместите a} перед последним трубом, и он будет завершен! Спасибо – guzzisto

+0

Могу ли я объединить эту команду с Where-Object {$ _. LastWriteTime -ge (Get-Date) .AddDays (-1)}?!? Если я не укажу тег -Name, Split не работает, если я использую тег -Name, то LastWriteTime недоступен ... – guzzisto

+0

Да, вы можете - увидеть мое редактирование. Разделение не работает, поскольку теперь, когда вы опустили '-Name', вы получаете коллекцию объектов назад, а не просто список имен. – alroc

0

передадите результаты вашей команды в | sort -unique

$files=Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse 
ForEach ($i in $files) { Write-Host $i.Substring(0,5) } | sort -unique 

... но еще лучше было бы, чтобы упростить сценарий ...

$filter = "TAS*.csv" 
Get-ChildItem -Path $strMOVETO -Filter $filter -Recurse | % {$_.BaseName.Substring(0,5) } | sort -unique 
+0

Briliant, спасибо! – guzzisto

1

Не тестировался, но что-то вроде этого:

Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse | % { $_.Name.Substring(0,5) } | Sort -Unique 

Вам не нужно делать Write-Host внутри цикла, и его проще использовать в% вместо цикла foreach.

Смежные вопросы