unix что такое - Является ли PowerShell готовым заменить мою оболочку Cygwin на Windows?





9 Answers

Grep

Командлет Select-String и -match работают с регулярными выражениями. Также вы можете напрямую использовать поддержку регулярных выражений .NET для более сложных функций.

Сортировать

Sort-Object более мощный (чем я помню * sort nix). Разрешение многоуровневой сортировки на произвольные выражения. Здесь помогает обслуживание базового типа PSH; например, свойство DateTime будет сортироваться как DateTime без необходимости форматирования в отсортированный формат.

уник

Select-Object -Unique

Perl (как близко PowerShell приходит к возможностям Perl?)

С точки зрения широты Perl для доменных библиотек поддержки: нигде не закрыта (пока).

Для общего программирования PSH, безусловно, более сплочен и последователен, и его легче расширить. Один пробел для текстового перебора - что-то, что эквивалентно оператору perl.

AWK

Это было достаточно долго, поскольку awk (должно быть> 18 лет, так как позже я просто использовал perl), поэтому не могу комментировать.

СЕПГ

[См. Выше]

file (команда, предоставляющая информацию о файле)

Сила PSH здесь заключается не столько в том, что она может делать с объектами файловой системы (и здесь она получает полную информацию, dir возвращает объекты FileInfo или FolderInfo мере необходимости) - это вся модель поставщика.

Вы можете рассматривать реестр, хранилище сертификатов, SQL Server, кеш RSS IE и т. Д. Как пространство объектов, которое можно перемещать с помощью тех же командлетов, что и файловая система.

PSH - это, безусловно, путь в Windows. MS сделали его частью своих требований к будущим не-домашним продуктам. Следовательно, богатая поддержка в Exchange, поддержка SQL Server, это только расширится.

Недавним примером этого является TFS PowerToys. Многие операции с клиентом TFS выполняются без необходимости запуска tf.exe каждый раз (для чего требуется новое подключение к серверу TFS и т. Д.), И, что особенно важно, обрабатывать данные. Помимо широкого доступа ко всему API-интерфейсу TFS для более подробной информации, чем в Team Explorer TF.exe.

conemu portable download

Я обсуждаю, следует ли изучать PowerShell или просто придерживаться сценариев скриптов Cygwin / Perl / Unix и т. Д.

Преимущество PowerShell заключается в том, что скрипты могут быть более легко использованы товарищами по команде, у которых нет Cygwin; однако, я не знаю, действительно ли я буду писать такие сценарии общего назначения, или если люди будут их использовать.

Сценарии Unix настолько мощные, что PowerShell подходит достаточно близко, чтобы гарантировать переключение?

Вот некоторые из конкретных вещей (или эквивалентов), которые я бы искал в PowerShell:

  • grep
  • Сортировать
  • уник
  • Perl (насколько близко PowerShell приходит к возможностям Perl?)
  • AWK
  • sed
  • файл (команда, предоставляющая информацию о файле)
  • и т.п.



Я использовал немного PowerShell для автоматизации скриптов. Хотя очень приятно, что среда, по-видимому, была продумана гораздо больше, чем оболочки Unix, на практике использование объектов вместо текстовых потоков гораздо более неуклюжие, и многие объекты Unix, которые были разработаны за последние 30 лет еще не хватает.

Cygwin по-прежнему является моей средой сценариев выбора для хостов Windows. Это, безусловно, превосходит альтернативы с точки зрения достижения цели.




Я только недавно начал заниматься PS в любой степени серьезности. Хотя за последние семь лет я работал в почти исключительно среде на базе Windows, я исхожу из фона Unix и постоянно пытаюсь использовать «Unix-fy» опыт взаимодействия с Windows. Это расстраивает, если не сказать больше.

Справедливо сравнивать PS с чем-то вроде Bash , tcsh или zsh поскольку утилиты, такие как grep , sed , awk , find и т. Д., Не являются, строго говоря, частью оболочки; однако они всегда будут частью любой среды Unix. Тем не менее, команда PS, подобная Select-String имеет очень похожую функцию grep и поставляется в виде основного модуля в PS ... поэтому линии могут быть немного размыты.

Я думаю, что ключевым моментом является культура , и тот факт, что соответствующие наборы инструментов будут воплощать их соответствующие культуры:

  • Unix - основанная на файлах (в общем, не Unicode) текстовая культура. Файлы конфигурации - это почти исключительно текстовые файлы. Windows, с другой стороны, всегда была гораздо более структурирована в отношении форматов конфигурации. Конфигурации обычно хранятся в проприетарных базах данных (например, в реестре Windows), для которых требуются специализированные инструменты для их управления.
  • Административный интерфейс Unix (и, на протяжении многих лет, разработка) традиционно был командной строкой и виртуальным терминалом. Windows запускалась как графический интерфейс, и административные функции только недавно начали отходить от использования исключительно GUI. Мы можем ожидать, что опыт Unix в командной строке будет более богатым, более зрелым, учитывая значительное лидерство в PS , и мой опыт соответствует этому. На этом, по моему опыту:

    • Административный опыт Unix направлен на то, чтобы сделать вещи легкими в минимальном количестве ключевых штрихов; это, вероятно, связано с исторической ситуацией, связанной с администрированием сервера по медленному подключению удаленного доступа 9600 бод. Теперь у PS есть псевдонимы, которые идут длинным путем, чтобы обойти довольно верный стандарт Verb-Noun , но знакомство с этими псевдонимами - это немного боль (кто-то знает что-то лучше, чем: alias | where {$_.ResolvedCommandName -eq "<command>"} ?).

      Пример богатого способа управления историей:

      Команды iptables часто длинны, и повторение их с небольшими различиями было бы болью, если бы не только одна из многих опрятных функций манипуляции истории, встроенных в Bash , поэтому вставка правила iptables, как показано ниже:

      iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT

      второй раз для другой камеры (« camera-2 ») - это всего лишь случай выдачи:

      !!:s/-1-/-2-/:s/50/51

      что означает «выполнить предыдущую команду, но замените -1- на -2- и 50 на 51 .

    • Опыт Unix оптимизирован для сенсорных машинистов; можно в значительной степени сделать все, не покидая «домашнего» положения. Например, в Bash , используя привязки клавиш Emacs (да, Bash также поддерживает привязки vi ), циклическое перемещение по истории выполняется с помощью Ctrl-P и Ctrl-N, в то время как переход к началу и концу строки выполняется с помощью Ctrl- A и Ctrl-E соответственно ... и это определенно на этом не заканчивается. Попробуйте даже простейшую навигацию в консоли PS, не двигаясь с домашней позиции, и у вас проблемы.

    • Простые вещи, такие как универсальный пейджинг (ala less ) в Unix, по-видимому, не доступны из-за коробки в PS, что немного разочаровывает, и богатого редактора тоже не существует. Конечно, всегда можно загружать сторонние инструменты, которые будут заполнять эти пробелы, но было бы неплохо, если бы эти вещи были просто «там», как будто они на самом деле похожи на Unix.
  • Культура Windows, по крайней мере, с точки зрения системных API, во многом зависит от поддерживающих фреймворков, а именно от COM и .NET , которые являются высокоструктурированными и объектно-ориентированными. С другой стороны, доступ к Unix API традиционно осуществляется через интерфейс библиотеки ( /dev и /proc ) или (не объектно-ориентированный) вызов библиотеки C-стиля. Неудивительно, что опыт создания сценариев соответствует их соответствующим парадигмам ОС. PS по своей природе структурирован (все - объект) и Bash- и-друзей основаны на файлах. Структурированный API, который находится в распоряжении программиста PS, обширен (в основном, соответствует обширности существующего набора стандартных интерфейсов COM и .NET).

Короче говоря, хотя возможности сценариев PS , возможно, более мощные, чем Bash (особенно когда вы рассматриваете доступность .NET BCL ), интерактивный опыт значительно слабее, особенно если вы используете его с полностью управляемой клавиатурой , консольная перспектива (как и многие Unix-головки).







Поскольку мои недавние эксперименты привели меня в глубины вызовов Powershell и .NET, я должен сказать, что Powershell может заменить оболочку Cygwin и Unix. Я не уверен в Perl, но поскольку и Powershell, и Perl являются Turing законченными как языки программирования, я даю это как да для замены Perl тоже. Одна вещь, которую Powershell имеет выше Cygwin и обычного bash под * nix, - это способность выполнять изолированные вызовы DLL, манипулирование операционной системой с помощью прямых вызовов API, методов WMI и даже COM-объектов. Как насчет запуска IE через код, а затем делать все, что хотите, с его отображаемым документом, эффективно эмулируя фоновый сервер для веб-сервера? Как собирать данные с SQL-серверов и других поставщиков данных, анализировать их и экспортировать как CSV, почтовые сообщения, текст и фактически любые существующие и несуществующие форматы файлов? (Разумеется, с надлежащими навыками создания достоверного файла из полученных данных, но CSV легко доступны). И есть дополнительная безопасность, доступная через подписанные командлеты и сценарии, групповые политики и политики выполнения, которые предотвращают запуск вредоносных кодов на вашем компьютере. даже если вы запускаете их как администратор.

О том, какие команды реализованы - ответ Ричарда перечисляет их и способность Powershell подражать их функциональности уже.

О том, является ли Powershell сильным, чтобы гарантировать переход - это больше зависит от личных предпочтений, хотя, поскольку все больше и больше сервисов Windows предоставляют командлеты Powershell для их контроля, использование Powershell с этими сервисами не является препятствием. (Сервер Hyper-V является основной такой услугой, он также предоставляет возможность делать больше с командлетами Powershell, чем с графическим интерфейсом!)

Вероятно, этот ответ задерживается на пять лет, но все же, если кто-то выполняет административные задачи или общие сценарии различных вещей в Windows, они должны определенно попытаться использовать Powershell для своих целей.




TL; DR - Я не ненавижу Windows или Powershell. Я просто ничего не могу сделать в Windows или Powershell.

В лучшем случае я все еще считаю, что в лучшем случае они не в восторге.

  • Заполнение табуляции в каталогах не связано, требуя, чтобы пользователь вводил разделитель путей после каждого завершения имени.
  • Я по-прежнему чувствую, что в окнах нет даже понятия пути или пути, без доступного индикатора пользователя пользователя. ~/ Short of some @environment://somejibberish/%user_home%
  • NTFS по-прежнему беспорядок и, похоже, всегда будет, удачи навигации.

  • Интерфейс cmd-esque, динозавр cmd.exe по-прежнему отображается в Powershell, edit->mark остается единственным способом копирования информации и копирования только в виде прямоугольных блоков видимого терминального пространства. и edit->paste остается единственным способом вставки строк в терминал.

  • Окраска его синего не делает ее более привлекательной. Я не возражаю против разработчиков MS, имеющих вкус в цвете.

  • Windows всегда открывается в верхнем левом углу экрана. Для тех, кто использует вертикальные панели задач, это невероятно раздражает, особенно учитывая, что панель задач Windows будет охватывать единственный угол окна, предоставляющий доступ к функциям копирования / вставки.

Я не могу много говорить о том, что включает окна инструментов. Будучи тем, что есть целый набор открытых, свободно лицензированных инструментов cli и корабли с полномочиями, насколько мне известно, ни одно из них не является полным разочарованием.

  • powershell wget принимает, казалось бы, несравнимые аргументы в gnu wget, благодаря проблеску надежды, бесполезно-бесполезно.
  • powershell posix не совместим с bash, в частности, оператор && не обрабатывается, что делает простейшую из условных команд следующей, а не вещью.

Я не знаю, я сделал это, я действительно это сделал; Я все еще пытаюсь дать ему шанс в надежде, что в следующий раз, когда я его открою, он будет менее бесполезным. Я ничего не могу сделать в PowerShell, и я могу смиренно делать с реальным проектом, чтобы принести инструменты gnu в Windows.

MySysGit дает мне подсказку cmd.exe динозавра с помощью нескольких инструментов gnu, которые все еще очень неудобны, но в конце концов работает завершение. и команда git будет запущена в gitBash

Mintty для MySysGit предоставляет интерфейс Cygwin поверх среды mysysgit, делая копию и вставляя вещи. (выберите для копирования (мышь), shift + ins для вставки, как современный ...), однако в Mintty нарушаются такие вещи, как git push .

Я не хочу говорить, но я все еще вижу огромные проблемы с удобством использования в командной строке на окнах даже с такими инструментами, как Cygwin.

PS Просто заставьте что-то сделать в powershell, don't сделать его пригодным к использованию , удобство использования глубже, чем способность, и именно с этим я склонен сосредоточиться, пытаясь использовать продукт в качестве потребителя.




Почему бы не использовать оба варианта? Вызовите скрипты PowerShell в Cygwin так же, как и любые другие интерпретируемые скрипты, такие как perl и т. Д.

Я делаю это достаточно, чтобы написать https://bitbucket.org/jbianchi/powershell для оболочки bash для вызова powershell.exe в Cygwin. Может использоваться как Shebang в качестве первой строки сценария powershell.exe .ps1 (поскольку powershell также использует «#» в качестве комментария). См. https://bitbucket.org/jbianchi/powershell/wiki/Home для примера.




В нескольких строках Cygwin и Powershell - это разные инструменты, однако, если у вас установлен Cygwin, вы можете запускать исполняемые файлы Cygwin в сеансе Powershell. Я настолько привык к Powershell, что теперь я больше не использую grep, sort, awk и т. Д. В Powershell есть довольно много встроенных альтернатив, и если нет, вы можете найти там командлет.

Основным инструментом, который я использую, является ssh.exe, но в рамках сеанса Powershell.

Работает отлично.




Я нашел, что программирование PowerShell не стоит усилий.

У меня есть многолетний опыт работы с shell-скриптами под Unix, но мне очень трудно было что-то сделать с PowerShell.

Кажется, что многие функции требуют от вас опроса интерфейса управления Windows и выдачи SQL-подобных команд для получения необходимой вам информации.

Например, я хотел написать сценарий для удаления всех файлов с определенным суффиксом из дерева каталогов. В Unix это было бы просто ...

find . -name \*.xyz -exec rm {} \;

Через пару часов обманывают Scripting.FileSystemObjectи WScript.Shellвыдают «SELECT * FROM Win32_ShortcutFile WHERE Drive = '» & drive & "' AND Path = '" & searchFolder & "'", я, наконец, сдался и установил команду поиска Windows Explorer и просто сделайте это вручную. Вероятно, есть какой-то способ сделать то, что я хотел, но я не видел ничего очевидного, и все примеры на сайте MSDN были настолько тривиальны, что были бесполезны.

EDIT Хех, конечно, как только я это написал, я еще несколько раз подсел и обнаружил, что мне не хватало: -recurseопция команды remove-item ошибочна (отображается, если вы используете get-help remove-item -detailed).

Я пытался «remove-item -filter» * .xyz '-recurse », и он не работал, поэтому я отказался от него.

Оказывается, вам нужно использовать get-childitem -filter '*.xyz' -recurse | remove-item






Related