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


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.

Question

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

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

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

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

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






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

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




Командлеты в powershell очень приятны и работают надежно. Их объектно-ориентированность очень нравится мне, поскольку я разработчик java / C #, но это совсем не полный набор. Поскольку он ориентирован на объекты, он пропускает много зрелости текстового потока набора инструментов POSIX ( awk и sed чтобы назвать несколько).

Лучший ответ, который я нашел для дилеммы любви к методам ОО и любви к зрелости в инструментах POSIX, - это использовать оба! Один большой аспект Powershell заключается в том, что он отлично подходит для работы с объектами трубопроводов для стандартных потоков. Powershell по умолчанию использует конвейер объекта для транспортировки своих объектов. Это не стандартные потоки (стандартная ошибка, стандартная ошибка и стандарт). Когда Powershell должен передать вывод стандартного процесса, который не имеет конвейера объекта, он сначала преобразует объекты в текстовый поток. Поскольку он делает это так хорошо, Powershell отлично подходит для размещения POSIX-инструментов!

Лучшим набором инструментов POSIX является GnuWin32 . Для установки требуется более 5 секунд, но это стоит того, и, насколько я могу судить, он не изменяет вашу систему (реестр, папки c:\windows\* и т. Д.), Кроме копирования файлов на которые вы указали. Это очень приятно, потому что если вы поместите инструменты в общий каталог, многие люди могут получить к ним доступ одновременно.

Инструкции по установке GnuWin32

Загрузите и выполните GnuWin32 (это с сайта SourceForge ), указав его на подходящий каталог (я буду использовать c:\bin ). Он создаст каталог GetGnuWin32 в котором вы запустите download.bat , а затем install.bat (без параметров), после чего появится c:\bin\GetGnuWin32\gnuwin32\bin который является наиболее полезной папкой, которая когда-либо существовал на машине Windows. Добавьте этот каталог на свой путь, и вы готовы к работе.




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

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




In a couple of lines, Cygwin and Powershell are different tools however if you have Cygwin installed you can run the Cygwin executables within a Powershell session. I've gotten so used to Powershell that now I no longer use grep, sort, awk, etc. There are pretty much built-in alternatives in Powershell, and if not you can find a cmdlet out there.

The main tool I find myself using is ssh.exe but within a Powershell session.

Works great.




Поскольку мои недавние эксперименты привели меня в глубины вызовов 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 для своих целей.




Много замечательных ответов, вот мой прием. PS готов, если вы ... Пример

grep = " Select-String -Pattern "

sort = "Sort-Object"

uniq = " Get-Unique "

file = " Get-Item "

cat = " Get-Content "

Perl / Awk / Sed - это не команда, но утилиты, следовательно, трудно сравнивать, но вы можете делать почти все в Powershell.




I found PowerShell programming to be not worth the effort.

I have several years of experience with shell scripting under Unix, but I found it enormously difficult to do much of anything with PowerShell.

It seems like many functions require you to interrogate the Windows Management Interface and issue SQL-like commands to get the information you need.

For example, I wanted to write a script to remove all files with a specific suffix from a directory tree. Under Unix, this would be a simple ...

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

After a couple of hours dicking around with Scripting.FileSystemObject and WScript.Shell and issuing "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" & drive & "' AND Path = '" & searchFolder & "'", I finally gave up and settled for Windows Explorer's Search command and just do it manually. There's probably some way to do what I wanted, but I didn't see anything obvious and all the examples on the MSDN site were so trivial as to be worthless.

EDIT Heh, of course as soon as I wrote this I poked around some more and found what I had been missing: the -recurse option to the remove-item command is faulty (revealed if you use get-help remove-item -detailed ).

I had been trying "remove-item -filter '* .xyz' -recurse" and it wasn't working, so I gave up on it.

Turns out you need to use get-childitem -filter '*.xyz' -recurse | remove-item




Related