Перемешивание элементов массива

Я нифига не понял как это работает, но нашел такое:
[collections.arraylist]$a = 0..51
$r = ($a.count-1)..0 |% {$R = new-object random}{$R.next(0,$a.count) |%{$a[$_];$a.removeat($_)}}

Оно работает, но если мне объяснят — как, то буду счастлив =)

[collections.arraylist]$a = 0..51 # Создаем объект типа arrayList (в отличии от # обычного array у него есть метод .RemoveAt) и помещаем в него все числа # от 0 до 51 включительно $ret = # Результат сортировки мы поместим в переменную $ret ($a.count-1)..0 | % { # это некий аналог for 🙂 просто выполняем операцию # столько раз, сколько элементов в массиве. % - это # просто алиас для foreach-object. # Кроме того, синтаксис foreach-object не ограничивается # одним блоком кода. foreach-object [{begin}] {process} [{end}] # блоки кода begin и end выполняются однократно, перед # и после обработки всех элементов соответственно. Блок # process выполняется для каждого элемента конвейера. $R = new-object random # Тут, перед началом обработки элементов создается # объект $R, для получения произвольных чисел }{ # теперь пошел блок process, он выполнится для каждого элемента конвейера $R.next(0,$a.count) | # Вызывается метод next объекта $R. Он выдает # произвольное число в пределах массива которое # передается по конвейеру дальше %{ # в foreach-object... $a[$_]; # теперь элемент под произвольным номером выдается в # конвейер дальше, и... $a.removeat($_) # удаляется из оригинального массива. } } # в результате на выходе будут элементы вытащенные из $a в произвольном порядке

Я бы сам наверное не понял бы такого объяснения 🙂 Так что спрашивайте что непонятно 🙂

Иначе можно было бы написать то же самое так:

[collections.arraylist]$Arr $Arr = 0..51 $Rnd = new-object System.Random $Result = @() for ($i = 0; $i -lt $Arr.count; $i++) { $Id = $Rnd.next(0,$Arr.count) $Result += $Arr[$Id] $Arr.RemoveAt($Id) }

Поиск дубликатов файлов

Часто бывает надо 🙂 Решается на PowerShell в 1 строчку 🙂

По каталогу рекурсивно отбираются файлы у которых одинаковое имя и размер:

[PS C:...Temp] Dir -rec | group name,length | where {$_.count -gt 1} Count Name Group ----- ---- ----- 2 file2.txt, 62804 {file2.txt, file2.txt} 2 file3.txt, 57860 {file3.txt, file3.txt}

Полные пути дубликатов, подряд:

[PS C:...Temp] Dir -rec | group name,length | ?{$_.count -gt 1} | Select -Expand group | ft fullname FullName -------- C:RootTempfile2.txt C:RootTempFolder6file2.txt C:RootTempfile3.txt C:RootTempFolder6file3.txt

Группами дубликатов:

[PS C:...Temp] dir -rec | group name,length | ? {$_.count -gt 1} | %{$_ | select -expand group | ft fullname} FullName -------- C:RootTempfile2.txt C:RootTempFolder6file2.txt FullName -------- C:RootTempfile3.txt C:RootTempFolder6file3.txt

Использованные сокращения (все присутствуют в PowerShell по умолчанию) 🙂 —

  • dir = get-childitem
  • -rec = -recurse
  • group = group-object
  • ? = where-object
  • % = foreach-object
  • select = select-object
  • ft = format-table
Опубликовано в Learn, PowerShell, Practice, Scripting, Tips. Комментарии к записи Поиск дубликатов файлов отключены