Готов ли PowerShell заменить мою оболочку Cygwin в Windows? [закрыто]


384

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

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

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

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

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

7
Я бы не сказал, что мне было интересно взять Powershell, я нашел эту страницу, и теперь я знаю общие различия между PS и сценариями оболочки, к которым я привык.
Величайший Бендер

5
Этот пост внезапно поднялся из пепла в представлении ссылки HN. Отличная работа. И плохо для @Bobby, потому что закрывать это не конструктивно.
Сид

26
Если кто-то не может спросить, насколько хорошо один инструмент реплицирует функции другого, SO не сможет ответить на вопросы сравнения инструментов. Это тщательно сформулировано, чтобы избежать противоречий, но было небрежно восприниматься как «противоречивое» просто потому, что выглядело как вопрос Unix против Windows. И он получил фактический, объективный ответ с дополнительным фактическим пониманием того, насколько полезными могут быть сценарии Unix для Windows.
Черневик

16
Почему это снова закрыто? Кто-то, пожалуйста, отредактируйте заголовок, чтобы сказать «PowerShell против оболочек Unix на платформе Windows», чтобы отвлечь троллей от трактовки его как «Windows против Unix», а это не так. Это совершенно конструктивный вопрос - проголосовал за открытие.
x0n

3
ОП смешивает оболочку с инструментами. PowerShell имеет свое применение. Но GNU - это проект, позволяющий свободно переносить вкусности UNIX на другие ОС, включая Windows. У каждой вещи в списке op есть реализация gnu в Windows. Доступно из GnuWin32 или отдельных сайтов. Windows BAT не бесполезна, она имеет перенаправление и канал и условия.
MeaCulpa

Ответы:


783

Инструменты - это просто инструменты.
Они помогают или нет.
Вам нужна помощь или нет.

Если вы знаете, что Unix и эти инструменты делают то, что вам нужно, чтобы они делали в Windows - тогда вы счастливый парень, и вам не нужно изучать PowerShell (если вы не хотите изучать).

Мое первоначальное намерение состояло в том, чтобы включить набор инструментов Unix в Windows и покончить с этим (многие из нас в команде имеют глубокие знания Unix и здоровую дозу уважения к этому сообществу).

Я обнаружил, что это не очень помогает. Причина в том, что AWK / grep / sed не работают с COM , WMI , ADSI , реестром, хранилищем сертификатов и т. Д. И т. Д.

Другими словами, UNIX - это целая экосистема, настроенная вокруг текстовых файлов. Таким образом, инструменты обработки текста являются эффективными инструментами управления. Windows - это совершенно другая экосистема, настроенная вокруг API и объектов. Вот почему мы изобрели PowerShell.

Я думаю, вы обнаружите, что будет много случаев, когда обработка текста не даст вам того, что вы хотите в Windows. В этот момент вам захочется подобрать PowerShell. ПРИМЕЧАНИЕ - это не все или ничего. В PowerShell вы можете обращаться к своим инструментам Unix (и использовать их текстовую обработку или обработку текста PowerShell). Также вы можете вызвать PowerShell из ваших инструментов Unix и получить текст.

Опять же - здесь нет религии - наша цель - дать вам инструменты, необходимые для достижения успеха. Вот почему мы так увлечены обратной связью. Дайте нам знать, где мы находимся на работе или у вас нет необходимого вам инструмента, и мы внесем его в список и доберемся до него.

Честно говоря, мы выкапываем себя из 30-летней ямы, так что это займет некоторое время. Тем не менее, если вы выберете бета-версию Windows Server 2008 / R2 и / или бета-версии наших серверных продуктов, я думаю, вы будете шокированы тем, как быстро эта дыра заполняется.

Что касается использования - у нас было> 3,5 миллиона загрузок на сегодняшний день. Сюда не входят люди, использующие его в Windows Server 2008, поскольку он включен в качестве дополнительного компонента и не требует загрузки.

V2 будет поставляться во всех версиях Windows. Он будет включен по умолчанию для всех выпусков, кроме ядра сервера, где он является необязательным компонентом. Вскоре после выхода Windows 7 / Windows Server 2008 R2 мы сделаем V2 доступным на всех платформах, Windows XP и выше. Другими словами - ваши инвестиции в обучение будут применимы к очень большому количеству машин / сред.

Последний комментарий Если / когда вы начнете изучать PowerShell, я думаю, вы будете очень счастливы. На дизайн в значительной степени влияют наши фоны Unix, так что, хотя мы сильно отличаемся от других, вы очень быстро его поймете (после того, как переспросите, что это не Unix :-)).

Мы знаем, что у людей очень ограниченный бюджет на обучение - вот почему мы очень ценим последовательность. Вы будете чему-то учиться, а потом будете использовать это снова и снова.

Эксперимент! Наслаждайтесь! Engage!


11
Спасибо за Ваш ответ. Я думаю, что я собираюсь пойти дальше и изучить PowerShell. Это выглядит мощно из того, что я видел до сих пор, и я смогу написать более полезные сценарии с ним на работе.
Энди Уайт

55
@ Джеффри: есть ли шанс для лучшего терминала для Windows? Powershell - мощный язык сценариев, но тот факт, что он запускается в cmd.exe, делает его гораздо более удобным в интерактивном режиме
sumek

47
Этот «неконструктивный» вопрос породил лучшее понимание, которое я видел в целом: «В Unix все является файловой» мантрой, и почему Windows отличается. Может быть, StackOverflow лучше подойдет для закрытия неконструктивных дискуссий ?
Черневик

12
@sumek - попробуйте ConEmu; Я использую его в течение нескольких недель , и это довольно мило: hanselman.com/blog/...
EZ Харт

4
Heads up: powershell не любит передавать двоичные данные. Так что будьте осторожны, когда вы называете свои надежные инструменты Unix, просто не делайте вещи, как tar -c . | gzip > package.tar.gz непосредственно в PowerShell, или вы будете страдать. См brianreiter.org/2010/01/29/...
Interarticle

123

Grep

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

Сортировать

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

уник

Select-Object -Unique

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

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

Для общего программирования PowerShell, безусловно, более согласованный и последовательный, и его легче расширять. Единственный пробел в обработке текста - это что-то эквивалентное ..оператору Perl .

AWK

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

СЭД

[См выше]

файл (команда, которая дает информацию о файле)

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

Реестр, хранилище сертификатов, SQL Server, кэш RSS в Internet Explorer и т. Д. Можно рассматривать как пространство объектов, которое можно перемещать с помощью тех же командлетов, что и файловая система.


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

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


2
Дело в том, что модель провайдера интересна только потому, что ОС не использует текст в качестве универсального средства настройки, поэтому вам НУЖНЫ эти провайдеры. В UNIX большинство языков имеют API для взаимодействия с PAM, хостами и пакетами, но в конечном итоге текст всегда будет там.
Daishiman

12
Текст не всегда лучший формат для всего (начните с баз данных и растровых изображений). Но я думаю, что мы можем согласиться не соглашаться, а вступать в войны открытого формата.
Ричард

5
Powershell может использовать любой объект в .NET Framework, разве это не соответствует возможностям домена Perl? Кроме того, вы можете написать командлеты на C # и т. Д., Если хотите повторного использования
Chris S

Точка за точкой сравнения. Хороший. Это должен быть принятый ответ. Сила PowerShell заключается в его основах .NET и в том, как легко вы можете расширить систему, написав новые командлеты или даже вызвав библиотеки классов
Sau001,

Типичное использование СЭД (я думаю) будет: sed 's/pattern/replacement/' file, что примерно gc file | %{$_ -replace 'pattern','replacement'}, а так же для AWK: awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' fileпримерно{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
Nathan Чэппелл

56

Как человек, чья карьера была сосредоточена на корпоративной разработке Windows с 1997 по 2010 год, очевидным ответом будет PowerShell по всем веским причинам, указанным ранее (например, это часть корпоративной стратегии Microsoft; она хорошо интегрируется с Windows / COM / .NET; и использование объектов вместо файлов обеспечивает «более богатую» модель кодирования). По этой причине я использовал и продвигал PowerShell последние два года или около того, с явным убеждением, что я следовал «Слову Билла».

Однако, как прагматик, я больше не уверен, что PowerShell - отличный ответ. Несмотря на то, что это отличный инструмент для Windows, он обеспечивает столь необходимый шаг на пути к заполнению исторической дыры, которой является командная строка Window, поскольку мы все наблюдаем за тем, как Microsoft контролирует потребительские компьютерные ошибки, все более вероятно, что у Microsoft впереди огромная борьба за сохранение своей ОС в качестве важно для предприятия будущего.

Действительно, учитывая, что моя работа все чаще находится в разнородных средах, я считаю, что сейчас гораздо удобнее использовать сценарии Bash, поскольку они работают не только в Linux, Solaris и Mac OS X, но и в сочетании с помощь Cygwin - на Windows.

Так что, если вы поверите в то, что будущее ОС скорее коммерциализировано, чем монополизировано, то, по-видимому, имеет смысл выбрать стратегию гибких инструментов разработки, которая по возможности обходится без проприетарных инструментов. Однако, если вы видите, что в вашем будущем доминирует все, что есть - Редмонд, тогда переходите на PowerShell.


1
Сценарии unix отлично работают на Cygwin-Windows без ошибок?
Pacerier

@Pacerier Я использую Cygwin и MinGW в течение 12 лет, и у меня были проблемы на удивление редко. Важно то, что если что-то не работает, всегда можно прибегнуть к инструментам Windows или к чему-либо еще - процессы могут быть запущены так же, как любая другая оболочка запускает их.
Евгений Сергеев

4
Хорошо, ваш ответ с 2011 года. Сегодня powershell работает и на Linux. И, по моему личному мнению, Bash слишком антиквариат. Синтаксис ужасен, и я бы предпочел использовать другой язык сценариев. В настоящее время, когда python является стандартом для большинства дистрибутивов Linux, я не вижу смысла использовать bash для скриптов. Я бы посоветовал вам еще раз проверить PowerShell, так как с 2011 года произошло много
событий.


33

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

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


27
Использование объектов - это смена парадигмы, к которой нужно привыкнуть. Но избегает полного повторного анализа на каждом шаге, где задействованы структурированные данные (например, нет необходимости проверять границы полей).
Ричард

16
@Andy White @Daishiman, я могу понять, где есть кривая обучения с PowerShell, но объекты конвейеризации могут быть гораздо более гибкими, чем тексты. @ Ричард прав. :)
Стивен Муравски

18
Автопроизводителям было трудно спорить с 1000+ лет лошадей тоже. Я не пытаюсь быть легкомысленным. Просто указав, что прошлый успех не устраняет потенциальную выгоду инноваций.
EBGreen

12
@daishiman - Преимущество Objects в том, что когда вы хотите свойство, вы запрашиваете его - вам не нужно анализировать, угадывать, приводить. Я не понял вашу мысль о том, «что происходит, когда объекты не имеют совместимых методов». Можете ли вы сказать это по-другому или привести пример проблемы? Спасибо.
Джеффри Сновер - MSFT

13
@Daishiman - я понимаю. На практике люди считают, что это не проблема, а огромное преимущество. Тем не менее, я вижу, что если бы вы были опытным анализатором текста, это был бы новый навык для изучения, который поначалу может показаться ненужным и неловким. Опять же - все, что помогает, является правильным инструментом.
Джеффри Сновер - MSFT

15

Здесь есть много отличных ответов, и вот мое мнение. PowerShell готов, если вы ... Примеры:

grep = " Выбрать-String -Pattern "

sort = "Sort-Object"

uniq = " Get-Unique "

file = " Get-Item "

cat = " Get-Content "

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


2
Можете ли вы поверить загадочным четырёхбуквенным командам, которые наши предки были вынуждены использовать?
Евгений Сергеев

4
@EvgeniSergeev Все выше доступны по умолчанию , как sls, sort, gu, gi, gc, соответственно. Длинные удобочитаемые имена, которые могут содержать табуляцию, и короткие имена с возможностью ввода в одной системе. Это удобный для вас прогресс.
TessellatingHeckler

Один из псевдонимов Get-Contentэто cat, так, что одна не существует какая -то разница между Cygwin / Unix и PowerShell. К сожалению, в большинстве случаев в документации Microsoft по командлетам отсутствует информация об псевдонимах, но список всех псевдонимов выводится при использованииGet-Alias в сеансе PowerShell. Псевдоним «Get-Unique» - «gu», поэтому он короче, чем у Cygwin / Unix!
Питер Мортенсен

13

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

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

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

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

    • Административный опыт Unix направлен на то, чтобы упростить процесс за минимальное количество нажатий клавиш; Вероятно, это связано с исторической ситуацией, когда пришлось администрировать сервер по медленному коммутируемому соединению со скоростью 9600 бод. Теперь в PowerShell есть псевдонимы, которые в значительной степени способствуют обходу довольно многословного стандарта 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соответственно ... и это , безусловно , не заканчивается там Попробуйте даже самую простую навигацию в консоли PowerShell, не переходя из исходного положения, и у вас возникнут проблемы.

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

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


Вы спрашиваете "кто-нибудь знает что-то лучше, чем: alias |, где {$ _. ResolvedCommandName -eq" <command> "}?". Как насчет просто alias -Definition *property(или любой другой шаблон)? Я думаю, что проблема с вашим ответом состоит в том, что вы объединяете оболочку и консоль: помните, что у вас есть выбор консолей с различными вариантами редактирования. Они намеренно оставили редактирование консоли DOS неработающим, чтобы побудить людей использовать другие консоли, такие как ISE.
Дункан

Кстати, ваш !!пример может быть написан на Powershell, (h -c 1) -replace '-1-','-2-' -replace '50','51' | iexно стрелку вверх и редактирование проще выполнить одной командой. Если вы хотите сделать это с помощью множества команд, думаю, Powershell победит. Чтобы повторить 10 команд, заканчивающихся на команде # 255, с вашими правками: (h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iexтакже история Powershell позволяет вам делать что-то неслыханное в оболочках Linux; если вы задаетесь вопросом ретроспективно, сколько времени потребовалось команде для запуска:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
Дункан

@Duncan Что касается вашего комментария по поводу оболочки и консоли - я думаю, что это просто фундаментальное различие между Bash и PS; то есть: Bash ожидает доставить определенный интерактивный опыт, в то время как PS «оставляет» это чему-то другому. У меня нет большого опыта работы с консолью ISE, но, насколько я помню, у нее нет и чрезвычайно богатого интерактивного опыта.
Эрик Смит

@ Дункан, да - хорошая точка зрения о способности PS предоставлять умные трюки с историей.
Эрик Смит

@Duncan ... но, несмотря на ваше утверждение, что некоторые вещи неслыханны в оболочках Linux:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
Эрик Смит,

8

Я ни в коем случае не очень опытный пользователь PowerShell, но мало того, что мне показалось, произвело на меня большое впечатление. Вы можете связать встроенные командлеты вместе, чтобы делать практически все, что вы могли бы делать в приглашении Unix, и есть некоторые дополнительные преимущества для таких вещей, как экспорт в CSV, таблицы HTML и для более глубоких типов системного администрирования. ,

И если вам действительно нужно что-то вроде sed , всегда есть UnixUtils или GnuWin32 , которые вы можете довольно легко интегрировать с PowerShell.

Как давний пользователь Unix, у меня, однако, были некоторые проблемы с привыканием к схеме именования команд, и я, безусловно, получил бы больше пользы от нее, если бы знал больше .NET.

Итак, по сути, я говорю, что стоит изучить его, если только его наличие в Windows не представляет проблемы.


1
Существует проект с открытым исходным кодом «Pash», который позволяет запускать PowerShell на других платформах через Mono. tinyurl.com/6dyoso
Джон Д. Кук

Ого! Спасибо за совет; Я не могу дождаться, чтобы попробовать
yalestar

6

Если вам нравится сценарий оболочки, вам понравится PowerShell!

Начните с экскурсии по командной оболочке Microsoft (Ars Technica).


8
Я люблю сценарии оболочки и терпимо отношусь к PowerShell. Это команды и синтаксис зверские. Ужасно длинные команды и опции без какого-либо полезного завершения команды. Или, если есть, я не нашел его. Слишком много функций втиснуто в отдельные команды, которые должны быть выделены. Странная переменная и escape-синтаксис, который может понравиться только пакетному программисту DOS.
Zan Lynx

8
@Zan Lynx - Вы правы, что ничего не нашли. Все команды имеют псевдонимы, и многие из них совпадают с командами DOS и UNIX (ps, dir, rm, ls, kill, history, man, cat, clear и т. Д.). Имена длинные, чтобы иметь осмысленное имя. Отлично подходит для сценариев - помогает, когда новый человек должен использовать и поддерживать его. Существует расширение вкладки для командлетов, функций, переменных, пути, параметров и т. Д. Большая часть синтаксиса взята из оболочек Unix, и о каком escape-синтаксисе вы говорите? `` не используется для escape, так как это разделитель пути в Windows.
manojlds

3
@Zan Lynx - Ваши аргументы неверны. Чтобы прекратить интерпретацию переменных, используйте '(одинарные кавычки). Для двойных двойных кавычек - то же самое, используйте write-output 'this is a "test"'. Вопрос, на который вы указываете, касается Regex, а экранирование для Regex действует везде. Powershell также имеет Here-Strings / дословные строки. Даже у Java этого нет! Попробуйте избежать регулярных выражений в Java. И вы иногда не используете буквальный путь. Вы используете, когда вам нужно. LiteralPath обрабатывает символы подстановки дословно и не раскрывает их. Вы используете это, когда ваши файлы имеют это. Это дает вам больше возможностей.
manojlds

3
@manojlds: По сравнению с оболочкой bash, Powershell полон несоответствий, которые не имеют смысла и просто сбивают с толку. В bash вы всегда используете один и тот же escape-символ, а пути к файлам экранируются так же, как и строки. Вам не нужен специальный параметр для этого. Если вы раскрываете переменную, в которой есть специальные символы, вы помещаете ее в двойные кавычки, и ее содержимое безопасно, нет необходимости вызывать функцию для ее повторного экранирования.
Zan Lynx

5
@Zan Lynx - нет никаких несоответствий. Даже write-output "this is a `"test`""работает. Просто используйте `вместо `\`. regex :: escape существует, чтобы помочь вам, чтобы вы не пропустили побег. Не нужно его использовать. Вы думаете, что дополнительные опции, которые могут помочь вам и предотвратить ошибки, являются несоответствиями.
manojlds

6

Поскольку мои недавние эксперименты привели меня к глубине вызовов PowerShell и .NET, я должен сказать, что PowerShell может заменить оболочку Cygwin и Unix.

Я не уверен насчет Perl, но так как PowerShell и Perl являются Turing завершенными как языки программирования, я даю это как замену Perl.

Одна вещь, которую PowerShell имеет над Cygwin и обычным Bash под * nix, - это ее способность выполнять изолированные вызовы DLL, манипулировать операционной системой через прямые вызовы API, методы WMI и даже COM-объекты. Как насчет запуска Internet Explorer через код, а затем делать все, что вы хотите с отображаемым документом, эффективно эмулируя серверную часть для веб-сервера?

Как насчет сбора данных с серверов SQL и других поставщиков данных, их анализа и экспорта в формате CSV, почтовых сообщений, текста и фактически любых существующих и несуществующих форматов файлов? (Конечно, при наличии соответствующих навыков создания действительного файла из полученных данных, но CSV легко доступны).

Кроме того, существует дополнительная защита, доступная через подписанные командлеты и сценарии, групповые политики и политики выполнения, которые помогают предотвратить запуск вредоносного кода в вашей системе, даже если вы запускаете их как администратор.

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

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

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


6

Когда вы сравниваете PowerShell с комбинацией Cygwin / Perl / Shell, имейте в виду, что PowerShell представляет только часть «Shell» этой комбинации.

Однако вы можете вызвать любую команду из PowerShell так же, как вы делаете это из cmd.exe или Cygwin. Он не реализует указанные функции и, конечно, не сопоставим с Perl.

Это «просто» оболочка, но она облегчает программирование, предоставляя удобный интерфейс ко вселенной .NET.

Также имейте в виду, что для PowerShell требуется Windows XP, Windows Server 2003 или выше, что может вызвать проблемы в зависимости от вашей ИТ-инфраструктуры.

Обновить:

Я понятия не имел, какие философские дебаты вызовет мой ответ.

Я опубликовал свой ответ в контексте вопроса: сравните PowerShell с Cygwin, Perl и Bash.

PowerShell - это оболочка, так как она не имеет синтаксической разницы между встроенными командами, командлетами, пользовательскими функциями и внешними командами (.exe, .bat, .cmd). Различаются только вызывающие методы .NET, добавляя пространство имен или объект в вызове.

Его программируемость проистекает из среды .NET, а не из чего-то определенного для «языка» PowerShell.

Я бы сказал, что считаю PowerShell «языком сценариев», как только Bugzilla или MediaWiki будут реализованы в виде сценариев PowerShell, работающих на веб-сервере;)

До тех пор наслаждайтесь сравнениями .


Да, я думаю, когда я говорю о «оболочке» Unix, я также имею в виду все обычные утилиты, которые поставляются с Unix, такие как grep, awk и т. Д. Мне просто интересно, предлагает ли PowerShell аналогичные утилиты из -коробка.
Энди Уайт

3
Powershell - это не просто оболочка. Это язык сценариев. Интересно, чем это не сравнимо с Perl? Я признаю, что он не такой зрелый, но кроме этого я не вижу различий.
EBGreen

@EBGreen, Что именно вы имеете в виду под этим комментарием? Я согласен, что любая оболочка или язык сценариев по своей сути похожи, но мне было интересно узнать больше о конкретных возможностях PowerShell по сравнению с bash / perl / другими оболочками Unix / языками сценариев.
Энди Уайт

2
Powershell обладает невероятно широким набором функций. Это - интерактивная, составная оболочка - богатый интерактивный язык сценариев - язык программирования. Он также имеет богатый набор служебных функций OO и tesxt (то есть эквивалентов grep / awk / etc).
Джеффри Сновер - MSFT

1
@ Энди - я понял Девио, чтобы сказать, что powershell не такой мощный, как Perl. Я не верю, что это правда, и я просто удивился, почему он так считает.
EBGreen

4

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

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

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

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

Скачать и запустить ех (это с сайта SourceForge ) , указывая его в нужный каталог (я буду использовать C:\bin). GetGnuWin32Там будет создан каталог, в котором вы будете работать download.bat, затем install.bat(без параметров), после чего будет C:\bin\GetGnuWin32\gnuwin32\binкаталог, который является самой полезной папкой, которая когда-либо существовала на компьютере с Windows. Добавьте этот каталог к ​​своему пути, и вы готовы к работе.


4

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


Лично я все еще нахожу PowerShell в лучшем случае не в восторге.

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

  • Интерфейс cmd-esque. Динозавр cmd.exe по-прежнему отображается в PowerShell. ПравкаОтметить - единственный способ копировать информацию и копировать только в виде прямоугольных блоков видимого пространства терминала. и EditMark по- прежнему единственный способ вставить строки в терминал.

  • Окраска в синий цвет не делает его более привлекательным. Я не против того, чтобы разработчики Microsoft имели вкус цвета.

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

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

  • PowerShell wgetпринимает, казалось бы, несопоставимые аргументы в GNU wget. Спасибо, проблеск надежды переносимо-бесполезный.
  • PowerShell POSIX не совместим с Bash, в частности, &&оператор не обрабатывается, что делает простейшую условную команду, не выполняющую ничего.

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

MySysGit дает мне приглашение dinosaur cmd.exe с несколькими инструментами GNU, и это все еще очень не радует, но в конце концов завершение пути работает. И команда Git будет работать в Git Bash.

Mintty for MySysGit предоставляет интерфейс Cygwin для среды mysysgit, позволяя копировать и вставлять объекты (выберите для копирования (мышь), Shift+ Insдля вставки, насколько современный ...). Тем не менее, такие вещи, как git pushсломаны в Mintty.

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


PS: то, что в PowerShell можно что-то сделать, не делает его пригодным для использования . Юзабилити глубже, чем способности, и на чем я стараюсь использовать продукт в качестве потребителя.


Включить режим QuickEdit? Выберите и нажмите Enter, чтобы скопировать, Ctrl-V, чтобы вставить, больше не Правка-> Отметить или Правка-> Вставить. Находясь в настройках, установите положение окна и снимите флажок «разрешить окно положения системы». Завершение табуляции - это не только завершение путей в файловой системе, но и завершение имен переменных, имен команд, свойств объекта, которые вы можете набрать .или [получить доступ к свойству или индексу, поэтому он не может просто добавить разделитель пути в конце. Какой именно PowerShell wget? Какой PowerShell POSIX? Он не пытается перенести инструменты gnu в Windows или быть совместимым с bash.
TessellatingHeckler

Да, я знаю, что он не пытается быть bash. Я воздержался от этого в оригинальном сообщении. Я бы сказал, что мы получим в двоичном виде, но в power shell нет команды "which" :( Я не помню, где купить, я читал power. Shell должен был быть POSIX-совместимым
ThorSummoner

5
Re: "Нет, который" -> (get-command wg*.exe).Path. Re: завершение bash и чтение строки -> leeholmes.com/blog/2012/09/13/… ведущий к github.com/lzybkr/PSReadLine
TessellatingHeckler

2

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

Для вашего затруднительного положения вам может быть лучше использовать язык сценариев, за которым могут отставать другие, Perl, как вы упомянули, или другие, такие как Ruby или Python.

Я думаю, что многое зависит от того, что вам нужно сделать. Лично я использую Python для своих собственных сценариев, но когда я начинаю писать что-то, что я никогда не смогу передать, я знаю, поэтому стараюсь не делать ничего слишком революционного.


2

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

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


1

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

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

Это прекрасно работает.


0

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

У меня есть несколько лет опыта работы со сценариями оболочки под 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 были настолько тривиальными, что были бесполезными.

РЕДАКТИРОВАТЬ Хех, конечно, как только я написал это, я обыскал еще немного и обнаружил, что мне не хватало: -recurseопция команды remove-item неверна (открывается, если вы используете get-help remove-item -detailed).

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

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


16
Я думаю, что вы путаете Windows Scripting Host (WSH) с PowerShell. Они совершенно разные.
Эрик Фанкенбуш

3
Например, если вы хотите удалить все файлы, заканчивающиеся на .TMN, вы можете выполнить эту команду get-childitem c: \ -include * .TMN -recurse | foreach ($ _) {remove-item $ _. fullname}
Эрик Фанкенбуш

@Mystere: Я попробовал это, и это не сработало. После некоторого размышления кажется, что * .tmn - это то, что вам нужно (а не просто .tmn)
redtuna

5
Я не мог с уважением не согласиться больше, и я ни в коем случае не парень Windows. Я считаю, что PS гораздо проще для сценариев, чем Bash. PS более последовательный. В Bash любая консольная утилита, которую вы вызываете, имеет собственный синтаксис и уникальное поведение, а сам синтаксис bash довольно загадочный. PS гораздо надежнее с такими языковыми функциями, как анонимные функции, (блоки сценариев), проверка параметров, расширенные функции и т. Д. Плюс концепции модулей для переносимости и многие другие функции. Главным образом, главная причина - это то, что вы всегда слышите о PS, объекты превосходят текст. Баш все еще быстрее, хотя.
user2233949


0

PowerShell очень мощный, более мощный, чем стандартные встроенные оболочки Unix (но только потому, что он включает в себя большую часть функциональности, обычно выделяемой подпрограммам). Также учтите, что вы можете писать апплеты на любом языке .NET, включая IronPython , IronRuby , PerlNet и т. Д., Или вы можете просто вызывать ваши команды Cygwin из PowerShell, игнорируя все дополнительные функции, и это будет работать аналогично Bash, KornShell , или что угодно ...


Я думаю, что вы, возможно, упускаете цели разработки оболочек Unix. Не сбиваю PowerShell (хотел бы узнать больше сам), но вам нужно понимать инструментарий Unix, чтобы сделать подобное заявление.
Jé Queue

2
@Xepoch - Нет, я думаю, что вы упускаете цели разработки PowerShell. PowerShell может делать все, что могут делать оболочки Unix, так же, как они. Однако настоящая сила приходит, когда вы используете систему объектных трубопроводов PS, а не просто анализируете вывод текста. Таким образом, PowerShell может делать именно то, что может делать bash или korn, но они не могут делать то, что может делать PowerShell.
Эрик Фанкенбуш

3
Я просто недостаточно знаю PowerShell, чтобы дать вам критическую оценку, но, как вы четко знаете, цели оболочек Unix - это не обязательно полная замена внешних инструментов, а скорее управляющих структур вокруг них. Опять же, в настоящее время я не могу ни сравнивать, ни противопоставлять, а повышать PowerShell, поскольку он имеет больше встроенных компонентов, не обязательно является благом оболочек Unix.
Jé Queue

@Xepoch - Дело в том, что вы можете выбрать, каким образом вы хотите это сделать. Вы можете использовать все достоинства встроенной оболочки, или вы можете игнорировать и делать это так, как это делает Unix. Это твой выбор. И выбор хорош, верно?
Эрик Фанкенбуш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.