Comments 23
Я может чего не понимаю, но зачем трогать физические параметры файлов? Разве нельзя в системе голосования заменить имена на случайные названия?
Что несколько отталкивает от PowerShell, так это многословность. По крайней мере мне так кажется. На wsh конечно не факт что короче будет.
На мой вкус, краткость это далеко не всегда хорошо. Главное, что код на павершеле получается относительно читабельный.
Многословность — вопрос желания. Можно написать многословно, а можно, например, вот так:
С оговорками, конечно (например, если на коллекции из 1000 файлов случайное число из диапазона в два миллиарда у вас совпало, то вы неудачник ;)), но это сделает ту же самую работу по переименованию файлов.
dir *.jpg | ForEach-Object {$newname = "pic"+$(Get-Random)+".jpg"; ren $_.name $newname}
С оговорками, конечно (например, если на коллекции из 1000 файлов случайное число из диапазона в два миллиарда у вас совпало, то вы неудачник ;)), но это сделает ту же самую работу по переименованию файлов.
Вот это уже ближе к теме :)
Шикарно, конечно, по сравнению с моим вариантом перевода C# кода на PowerSell. :-)
Но наличие «многословного» варианта все же отнесу к плюсам, порог вхождения тех же C# программистов ниже.
Но наличие «многословного» варианта все же отнесу к плюсам, порог вхождения тех же C# программистов ниже.
Все же, даже на баше это проще читается:
for name in *.jpg; do mv $name $RANDOM.jpg; done
или
for name in *.jpg; do mv $name `openssl rand -hex 8`.jpg; done
Если воспользоваться алиасами и не заводить переменных можно еще короче
но тут нет гарантии уникальности — теоретически фотка может затереться — пока у меня ничего короче сем вот это не получилось
ls *.jpg | %{ ren $_ pic$(random).jpg }"}
но тут нет гарантии уникальности — теоретически фотка может затереться — пока у меня ничего короче сем вот это не получилось
$files = ls *.jpg
$files = random $files -count $xs.length
0..($files.length-1) | %{ren $files[$_] pic$_.jpg -whatif}
Извините, оставил отладочное
и
ls *.jpg | %{ ren $_ pic$(random).jpg }}
и
$files = ls *.jpg
$files = random $files -count $files.length
0..($files.length-1) | %{ren $files[$_] pic$_.jpg }
Блин, вы из нормально структурированного и комментированного скрипта сделали какой-то огрызок. Понятно, что в целях демонстрации, но читабельность кода сильно ухудшилась, имхо.
каких комментов и структуры вам нехватает?
имхо читабельность ухудшилась только для людей не знающих powershell
имхо читабельность ухудшилась только для людей не знающих powershell
Я в достаточной степени знаю powershell, так что ваше утверждение безосновательно либо субъективно. Моё высказывание при этом, конечно, тоже субъективно, о чём отдельно свидетельствует слово «имхо» :-)
Нет, серьёзно, вариант в топике намного проще для восприятия.
Нет, серьёзно, вариант в топике намного проще для восприятия.
Тогда непонятно каких комментов вам не хватает. Моя строчка это буквальный перевод на powershell «для всех файлов *.jpg переименовать их в „pic<случайное число>.jpg“(я даже не могу придумать как это осмысленно прокомментировать не переписывая спраку по powershell) у автора нагромождение повторения конструкций PoSh только стредствами переписывания их через библиотеки дотнет. Причем их автор тоже не знает. Возьмем например:
вместо вызова GetFilenameWithoutExtension
Это надо еще глазами распарзить это дело и понять, что интенция автора — получить имя файла.
В-общем, мое мнение, что если человек знает синтаксис powershell и базовые команды (или не поленится посмотреть просто справку) то ему понятней будет однострочник.
Вот расшифровка построчная
Вот мегапрокомментирванный код, только все коментарии сводятся к объяснению синтаксиса и базовых средств работы с объектами в powershell
$name = $path.Substring($path.lastindexof('\') + 1, $path.lastindexof('.') - $path.lastindexof('\') - 1)
вместо вызова GetFilenameWithoutExtension
Это надо еще глазами распарзить это дело и понять, что интенция автора — получить имя файла.
В-общем, мое мнение, что если человек знает синтаксис powershell и базовые команды (или не поленится посмотреть просто справку) то ему понятней будет однострочник.
Вот расшифровка построчная
ls *.jpg # выбрать все файлы *.jpg. ls - это алиас для Get-ChildItem
| # pipe - таким символом команды PowerShell присоединяются друг к другу. То есть на вход следующей команды будет подан выход предыдущей
% # алиас для ForEach-Object - оманда вызывает следующей за ней блок для каждого элемента входа
{ # это открывающая скобка - начало блока
ren # это алиас для Rename-Item
$_ # это теущий аргумент блока - то есть в нашем случае - файл
pic$(random).jpg #строчка с выражением внутри. random - алиас для Get-Random - получение случайного числа, или случайного объекта из списка
} #конец блока
Вот мегапрокомментирванный код, только все коментарии сводятся к объяснению синтаксиса и базовых средств работы с объектами в powershell
C дотнетом — круто со всех сторон, сомнений нет. Только в вашем исходном варианте его не было.
Ладно, это, в общем-то вопрос вкуса и незачем тут разводить холивары :-) Зато вот на баше «длинный» вариант, думаю, сделать куда как сложнее, чем на powershell «короткий».
Ладно, это, в общем-то вопрос вкуса и незачем тут разводить холивары :-) Зато вот на баше «длинный» вариант, думаю, сделать куда как сложнее, чем на powershell «короткий».
Вы эту багу в исходнике сразу увидели?
return $path.Replace($name, $sb)
зайдите в powershell и наберите команду alias — там перечислены короткие имена, которыми можно пользоваться. Также можно добавлять свои алиасы.
Sign up to leave a comment.
PowerShell: Перемешиваем файлы