Комментарии 24
сейчас доля Windows составляет 14,7%, а доля Unix-подобных систем — 85,6%
Вместе больше 100%??
Разумеется, в графических, видео- и звуковых редакторах, а также многих других областях графический интерфейс незаменим. Работа с ним может выглядеть очень профессионально. Но обычно действия в нём довольно простые, а повторять нечего.
То-то макросы и скрипты есть буквально во всём: текстовых редакторах, видеомонтажках, звуковых редакторах, графических - достаточно вспомнить Actions в Photoshop. И речь не просто о горячих клавишах. Хотя, есть и программы, позволяющие последовательности нажатий клавиш записывать и повторять.
Создал Windows Powershell а потом Powershell 7 которые между собой не совсем совместимы.
Полюс версии Windows Powershell между собой не очень совместимы, как всегда MA в лучших традициях….
Вместо того чтобы использовать имеющиеся утилиты, и просто добавить нормальный скриптовый язык, хоть тот же bash портировать, родили новое чудо в перьях, которое вроде работает но не как нормальный скрипт, и не как нормальный язык программирования с классами.
Это как с file link, вроде добавили, но пользоваться нормально нельзя. Что-то Linux подобное только в development mode можно включить.
Сей час залез в wiki, очень порадовало:
Powershell cmdlet : Test-Connection
Alias: ping
Windows command prompt: ping
Linux: ping
Кто этот гений, который для простой, де-факто стандартной команды: ping придумал имя Test-Connection?
Интересно, есть статистика, кто Test-Connection пишет вместо ping?
Дак там же (в Повершелле) под капотом Дотнет, насколько я помню. Оттуда и дотнетоподобные названия команд.
Там есть идея начинать команды с глагола из одобренного списка ради унификации, но обычно аз-за алиасов это проблем не вызывает ("Alias: ping" - откуда это? Ни в wiki, ни в 7.2 нет).
Гениев надо искать другим образом.
Powershell до последнего времени не умел передавать через пайпы двоичные данные. Объекты внутри Powershell - нормально, текст и нативные приложения - нормально, двоичные данные и нативные предложения - нельзя, они парсятся как текст, ломаются и это не отключалось первые 17-18 лет. Решение - вызывать cmd.exe /с и использовать пайпы в нём.
Powershell при вызове нативных приложений автоматически парсит аргументы, чтобы их можно было записывать как в обычном шелле (а не массивом строк), но отдельно доступа к парсеру не даёт.
./metaflac --show-bps --show-md5sum "some name.flac"
- да, но если аргументы лежат в переменной-строке, то никак нет, распарсить в массив строк надо как-нибудь самостоятельно. С помощью вызова cmd.exe, например.Команды по умолчанию принимают пути с wildcard'ами.
*
и?
в Windows и так нельзя использовать в именах файлов, так в чём же проблема? А к ним добавили[
и]
. Проблема решается специальным параметром -LiteralPath (-lit) вместо [-Path], но его повсюду добавлять утомительно, поэтому во все команды его решили и не добавлять...И так далее. Powershell то гениален, то гениально туповат. Неизбежное "разворачивание" массива из 1 объекта в объект. Театр безопасности с запретом запуска двойным кликом или перетаскиванием, что решается опять не без помощи cmd.exe, подобными файлами-химерами:
<# : batch part begin
@echo off & pwsh -c "cat '%~f0' | Out-String | Invoke-Expression" & pause & exit /b
batch part end #>
# powershell code...
передавать через пайпы двоичные данные
Потому что Windows PowerShell делался для администрирования Windows, а там такое нужно супер-редко: за 15 лет мне ни разу такое не понадобилось.
если аргументы лежат в переменной-строке, то никак нет, распарсить в массив строк надо как-нибудь самостоятельно
Скажите, пожалуйста, в каком сценарии такое требуется? Тот пост на SO не даёт контекста зачем топикстартеру это нужно.
Потому что Windows PowerShell делался для администрирования Windows, а там такое нужно супер-редко: за 15 лет мне ни разу такое не понадобилось.
Зато парсить вывод утилиты самостоятельно (из-за того что она пишет в своей особенно кодировке) нужно супер часто, а нельзя.
Скажите, пожалуйста, в каком сценарии такое требуется? Тот пост на SO не даёт контекста зачем топикстартеру это нужно.
В основном потому что люди привыкли аргументы записывать в строку "как в баше", и не в курсе что даже в баше для этих целей давно уже можно использовать массивы.
Всё-таки он уже 8 лет кроссплатформенный и на роль всесторонней замены cmd.exe его метили изначально.
Mozjpeg'овский jpegtran, например, имеет вывод только в stdout, в Powershell перенаправление двоичного потока в файл тоже сломано в рамках этой багофичи.
Скажите, пожалуйста, в каком сценарии такое требуется?
Когда строка аргументов уже есть*, или когда её нужно сильно менять. В некоторых программах строка аргументов плавно перетекает в целый скриптовый язык, как в imagemagick, нужна гибкость хотя бы на уровне батников.
* Выше можно дописать @echo off & set "bat_args=%*" & pwsh...
и получить доступ из Powershell-части так:$env:bat_args
(это будет сырая строка, которую надо парсить).
Powershell при вызове нативных приложений автоматически парсит аргументы, чтобы их можно было записывать как в обычном шелле (а не массивом строк), но отдельно доступа к парсеру не даёт
Есть же Invoke-Expression, вы его даже использовали ниже
Неизбежное "разворачивание" массива из 1 объекта в объект.
Есть такое, "контрится" через Array subexpression operator, который @()
А ввели его потому что иначе ни одна команда не смогла бы вернуть одиночный объект в принципе, они же всегда поток объектов возвращают.
.Театр безопасности с запретом запуска двойным кликом или перетаскиванием, что решается опять не без помощи cmd.exe, подобными файлами-химерами:
Что-то сложное у вас написано. зачем тут вообще Invoke-Expression?
pwsh -file "%~f0" -executionpolicy bypass
Что-то сложное у вас написано. зачем тут вообще Invoke-Expression?
Проще не выйдет, потому что cmd.exe и Powershell щепетильно относятся к расширениям. Файл должен иметь расширение .bat или .cmd, чтобы его выполнял cmd.exe. Но чтобы сработал pwsh -File, нужно расширение .ps1. Не обойтись без временного файла с правильным расширением (.ps1) или "eval" файла как строки.
Есть такое, "контрится" через Array subexpression operator, который
@()
В одних случаях через @()
, в других через ,()
. Если если вместо первого по ошибке использовать второе, то вместо пустого массива можно получить массив с одним $null
. Если наоборот, то где-то вместо двухмерного массива может получиться одномерный. В третьих случаях через -NoEnumerate
, в четвёртых лучше заранее смириться. Для отладки полезен вывод ConvertTo-Json $obj
.
Не знаю, возврат массива из одного элемента мог бы оказаться меньшей проблемой - выручала бы фича member-access enumeration, когда обращение отсутствующему члену массива разворачивается в обращение к членам всех элементов: @('abc','def').ToUpper()
(у массива нет методаToUpper()
, поэтому метод вызовется у каждого элемента массива).
Есть же Invoke-Expression, вы его даже использовали ниже
У eval есть известные недостатки, иногда его стоит избегать... и нелепым образом как-нибудь добывать парсер аргументов (самописный / на регулярках / из cmd.exe / изConvertFrom-Csv
/ из WinAPI CommandLineToArgvW
).
Я такое не пишу, конечно. Но пишу sl вместо cd и gci вместо dir.
ping - это встроенная команда в ОС
Test-Connection - PowerShell командлет
Они обладают разными возможностями, отдают результат в разных форматах. Делать алиас ping, значит усложнять доступ к нативной команде. Вон с алиасом wget сколько уже наелись.
Кто этот гений, который для простой, де-факто стандартной команды: ping придумал имя Test-Connection?
Там все команды такие, лично меня уже через 10 минут работы они раздражать перестали (хвала автодополнению)
Создал Windows Powershell а потом Powershell 7 которые между собой не совсем совместимы.
Скрипты/команды Windows PowerShell прекрасно работают в PowerShell (который Core/6/7 etc.). Но в PowerShell добавили новые возможности, которые отсутствуют в Windows PowerShell - вот и всего.
Выглядит очень похоже на краткий пересказ подкаста CORECURSIVE #102 "Navigating Corporate Giants Jeffrey Snover and the Making of PowerShell", но почему-то никакого его упоминания нет. Правильно ли это?
С другой стороны, консольными скриптами можно обмениваться. И если один администратор удачно выполнил задачу, он может поделиться своим скриптом с другими. Именно поэтому Unix доминирует на серверах с 80-х годов
Windows Script Host (WSH) поддерживается с середины 90-х. На JS или VBS можно было писать любые скрипты.
Джеффри Сновер и создание PowerShell