Чи готовий PowerShell замінити мою оболонку Cygwin у Windows? [зачинено]


384

Я обговорюю, чи варто вивчати PowerShell, чи просто дотримуватися скриптів Cygwin / Perl / скриптів оболонки Unix тощо.

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

Сценарій Unix є настільки потужним, чи PowerShell наблизився досить близько, щоб вимагати перемикання?

Ось деякі конкретні речі (або їх еквіваленти), які я шукав би в PowerShell:

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

7
Я б не сказав цього, мені було цікаво підібрати Powershell, знайшов цю сторінку, і тепер я знаю загальні відмінності між PS та сценарієм оболонок, до яких я звик.
Бендер найбільший

5
Цей пост несподівано піднявся з попелу у поданні посилання на НН. Чудова робота. І погано для @Bobby, що він закрив це як не конструктивне.
Сід

26
Якщо хтось не може запитати, наскільки добре один інструмент копіює функції іншого, то ТАК не може відповісти на питання порівняння інструментів. Це ретельно сформульовано, щоб уникнути суперечок, але було необережно вважати "суперечливим" просто для того, щоб виглядати як питання Unix проти Windows. І він отримав фактичну, об'єктивну відповідь з додатковим фактичним розумінням того, наскільки корисні сценарії Unix можуть бути у Windows.
chernevik

16
Чому це знову закрито? Хтось, будь ласка, відредагуйте назву, щоб сказати "PowerShell vs Unix оболонки на платформі Windows", щоб відмовити тролів від трактування цього як "Windows проти Unix", а це не так. Це ідеально конструктивне питання - проголосували за повторне відкриття.
x0n

3
Оп - це змішування оболонки з інструментами. PowerShell має своє використання. Але GNU - це проект, щоб вільно принести UNIX смаколики в інші ОС, включаючи Windows. Кожна річ у списку оп дає можливість мати gnu реалізацію в Windows. Доступний з GnuWin32 або окремих сайтів. BAT Windows не є марним, він має перенаправлення, а також умови та умови.
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 :-)).

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

Експериментуйте! Насолоджуйтесь! Займайся!


11
Дякую за вашу відповідь. Я думаю, що я буду йти вперед і вивчати PowerShell. Це виглядає потужно від того, що я бачив досі, і я зможу написати більше корисних сценаріїв з ним на роботі.
Енді Уайт,

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

47
Це "не конструктивне" питання породило найкраще розуміння, яке я бачив у цілому "на Unix все - файлова" мантра, і чому Windows відрізняється. Можливо, StackOverflow краще послужить закриттю не конструктивних дискусій ?
chernevik

12
@sumek - Спробуйте ConEmu; Я використовую його протягом декількох тижнів, і це дуже солодко: hanselman.com/blog/…
EZ Hart

4
У голові: Powerhell не любить передавати двійкові дані. Тож будьте обережні, коли ви телефонуєте до своїх надійних інструментів Unix, просто не робіть таких матеріалів, як tar -c . | gzip > package.tar.gz безпосередньо в PowerShell, інакше ви постраждаєте. Дивіться brianreiter.org/2010/01/29/…
Interarticle

123

греп

Select-Stringcmdlet і -matchоператор працюють з регулярними виразами. Також ви можете безпосередньо скористатися підтримкою регулярних виразів .NET для більш розширеної функціональності.

сортувати

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

uniq

Select-Object -Unique

Perl (наскільки близько PowerShell наближається до можливостей Perl?)

З точки зору широти Perl, орієнтованої на доменні бібліотеки підтримки: ніде близько (поки що).

Що стосується загального програмування, PowerShell, безумовно, є більш згуртованим та послідовним та легшим для розширення. Один проміжок для розміщення тексту - це щось еквівалентне ..оператору Perl .

AWK

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

sed

[Дивись вище]

файл (команда, яка дає інформацію про файл)

Сила 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 рамках, чи не відповідає можливостям домену Perl? Крім того, ви можете писати командлети на C # тощо, якщо ви хочете повторно користуватися
Chris S

Порівняння по пунктах. Хороший. Це має бути прийнятою відповіддю. Сила PowerShell полягає в його основах .NET і тому, як легко ви можете розширити систему, написавши нові Cmdlets або навіть зателефонувавши до бібліотек класів
Sau001

Типовим використанням sed (я думаю) було б: 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{};}
Натан Чаппелл

56

Як хтось, чия кар'єра була зосереджена на розробці Windows в період з 1997 по 2010 рік, очевидною відповіддю буде PowerShell з усіх поважних причин (наприклад, це частина корпоративної стратегії Microsoft; вона добре інтегрується з Windows / COM / .NET; і використання об'єктів замість файлів передбачає "багатшу" модель кодування). З цієї причини я використовував і просував PowerShell протягом останніх двох років або близько того, з вираженою переконанням, що я слідував за «Словом Білла».

Однак, як прагматик, я більше не впевнений, що PowerShell є такою чудовою відповіддю. Хоча це чудовий інструмент Windows і забезпечує дуже потрібний крок до заповнення історичної діри, яка є командним рядком Window, оскільки ми всі спостерігаємо за тим, як Microsoft впорається з споживчими комп'ютерними ковзаннями. важливі для підприємства майбутнього.

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

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


1
Чи ідеально сценарії Unix працюють на Cygwin-Windows без помилок?
Pacerier

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

4
Гаразд, ваша відповідь з 2011 року. Сьогодні повноваження працює і на Linux. І - моя особиста думка - баш занадто античний. Синтаксис жахливий, і я скоріше використовую іншу мову сценаріїв. Сьогодні, коли python є стандартним для більшості дистрибутивів Linux, я не бачу причин використовувати bash для скриптів. Я б радив вам перевірити повноваження ще раз, оскільки це сталося багато з 2011 року
itmuckel


33

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

Cygwin все ще є моїм сценарієм для вибору хостів Windows. Це, безумовно, перемагає альтернативи з точки зору того, що можна зробити.


27
Використання об'єктів - це зміна парадигми і потребує певного звикання. Але дозволяє уникнути повного повторного аналізу на кожному кроці, де задіяні структуровані дані (наприклад, не потрібно обмежувати поля).
Річард

16
@Andy White @Daishiman, я можу зрозуміти, де є крива навчання з PowerShell, але трубопровідні об'єкти можуть бути набагато гнучкішими, ніж текстові тексти. @Richard правильний. :)
Стівен Муравський

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

12
@daishiman - Користь Об'єктів полягає в тому, що коли ви хочете властивість, ви просите її - вам не потрібно розбирати, здогадуватися, відкидати. Я не зрозумів вашу думку про те, "що відбувається, коли об'єкти не мають сумісних методів". Чи можете ви сказати іншим способом або навести приклад проблеми? Дякую.
Джефрі Сновер - MSFT

13
@Daishiman - я розумію. На практиці люди вважають, що це не є проблемою, а є величезною перевагою. З цього приводу я можу бачити, що якби ви були експертним аналізатором тексту, це було б новим навиком для навчання, і спочатку воно може відчувати себе непотрібним і незручним. Знову ж таки - все, що допомагає, є правильним інструментом.
Джефрі Сновер - MSFT

15

Тут є багато чудових чудових відповідей, і ось моя думка. PowerShell готовий, якщо ви ... Приклади:

grep = " Select-String -Pattern "

sort = "Сортувати-об'єкт"

uniq = " Get-Unique "

file = " Отримати елемент "

cat = " Отримати вміст "

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-fy" переглядати свій досвід взаємодії в Windows. Найменш засмучуюче.

Справедливо лише порівняти PowerShell з чимось на зразок Bash , tcsh або zsh, оскільки утиліти, такі як grep , sed , awk , find тощо, не є, строго кажучи, частиною оболонки; Однак вони завжди будуть частиною будь-якого середовища Unix. Тим НЕ менше, команда PowerShell , як Select-String має дуже схожу функцію Grep і в комплекті в якості основного модуля в PowerShell ... так що лінії можуть бути дещо розмитими.

Я думаю, що головне - це культура , а також те, що відповідні набори інструментів втілюють їхні відповідні культури:

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

    • Управлінський досвід Unix орієнтований на те, щоб зробити речі простіми в мінімальній кількості ключових ударів; це, мабуть, є наслідком історичної ситуації з необхідністю адмініструвати сервер через повільний комутаційний зв'язок 9600 бод. Тепер у PowerShell є псевдоніми, які проходять довгий шлях, щоб обійти досить багатослівний стандарт дієслова-іменника , але знайомство з цими псевдонімами - це біль (хтось знає про щось краще, ніж 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 API Unix традиційно здійснюється через файловий інтерфейс ( /devі /proc) або (не об'єктно-орієнтований) виклик бібліотеки у стилі C. Тож не дивно, що сценарійний досвід відповідає їх парадигмам ОС. PowerShell за своєю природою структурований (все є об'єктом) та Bash -and-friends на основі файлів. Структурований API, який є в розпорядженні програміста PowerShell, є величезним (по суті відповідає перевазі існуючого набору стандартних інтерфейсів COM та .NET).

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


Ви запитуєте "хтось знає про щось краще, ніж: псевдонім | де {$ _. ResoluCommandName -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, але, як я пам'ятаю, він також не має надзвичайно багатого інтерактивного досвіду.
Ерік Сміт

@Duncan, так - хороший момент щодо здатності 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. Команди та синтаксис є химерними. Жахливо довгі команди та параметри без корисного виконання команд. Або якщо є, я його не знайшов. Занадто багато функцій, набитих окремими командами, які слід розділити. Дивний синтаксис змінної та втечі, який може полюбити лише програміст пакетів DOS
Зан Лінкс

8
@Zan Lynx - Ви праві, що не знайшли речі. Усі команди мають псевдоніми, і багато з них відповідають як командам DOS, так і UNIX (ps, dir, rm, ls, kill, історія, людина, кішка, чітка тощо). Імена довгі, щоб вони мали значущу назву. Відмінно підходить для сценаріїв - це допомагає, коли новій людині доводиться її використовувати та підтримувати. Існує розширення вкладки для командлетів, функцій, змінної, шляху, параметрів тощо. Значна частина синтаксису - з оболонок Unix, і про який синтаксис втечі ви говорите? `` не використовується для втечі, оскільки це роздільник шляхів у Windows.
manojlds

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

3
@manojlds: У порівнянні з баш-корпусом, Powershell сповнений невідповідностей, які не мають сенсу і просто плутають. У bash ви використовуєте один і той же символ втечі скрізь, а шляхи до файлів уникають так само, як і рядки. Для цього вам не потрібен спеціальний параметр. Якщо ви розгорнете змінну, яка містить в собі спеціальні символи, ви помістите її в подвійні лапки, і вміст є безпечним, не потрібно викликати функцію, щоб повторно вийти з неї.
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 / тощо).
Джефрі Сновер - MSFT

1
@Andy - Я зрозумів, що Девіо сказав, що панцир не такий потужний, як Perl. Я не вірю, що це правда, і я просто цікавився, чому він вважає, що це так.
EBGreen

4

Команди в PowerShell дуже приємні та працюють надійно. Їх об'єктно-орієнтована цінність мені подобається, оскільки я розробник Java / C #, але це зовсім не повний набір. Оскільки він орієнтований на об'єкт, він пропускається на багато зрілості текстового потоку набору інструментів POSIX ( awkіsed назвати декілька).

Найкраща відповідь, яку я знайшов на дилему любити методики OO та любити зрілість в інструментах POSIX - це використовувати обидва! Одним з важливих аспектів PowerShell є те, що він виконує відмінну роботу, проводячи об'єкти до стандартних потоків. PowerShell за замовчуванням використовує об'єктний конвеєр для транспортування своїх об'єктів навколо. Це не стандартні потоки (стандартний вихід, стандартна помилка та стандартний вхід). Коли PowerShell потрібно передати вихідний сигнал до стандартного процесу, який не має об'єктного конвеєра, він спочатку перетворює об'єкти в текстовий потік. Оскільки це робить так добре, PowerShell робить прекрасне місце для розміщення інструментів POSIX!

Найкращий набір інструментів POSIX - це GnuWin32 . Інсталяція займає більше 5 секунд, але це коштує проблем, і наскільки я можу сказати, вона не змінює вашу систему (реєстр,c:\windows\* папки тощо), крім копіювання файлів у вказані вами каталоги. Це надзвичайно приємно, оскільки якщо помістити інструменти у загальний каталог, багато людей можуть одночасно отримати доступ до них.

Інструкції з установки GnuWin32

Завантажте та виконайте exe (це з сайту 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, РедагуватиПозначити як і раніше єдиний спосіб копіювання інформації та копіювання лише у вигляді прямокутних блоків видимого кінцевого простору. та РедагуватиПозначити як єдиний спосіб вставити рядки в термінал.

  • Фарбування синім кольором не робить його більш привабливим. Я не проти, щоб розробники Microsoft мали смак у кольорі.

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

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

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

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

MySysGit дає мені динозавр cmd.exe підказку з парою інструментів GNU, і це все ще дуже непохитно, але нарешті завершення шляху працює. І команда Git запуститься в Git Bash.

Mintty для MySysGit надає інтерфейс Cygwin над середовищем mysysgit, роблячи копіювати та вставляти річ (виберіть для копіювання (миші), Shift+ Insдля вставки, як сучасне ...). Однак такі речі, якgit push Мінтті, зламані.

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


PS: Тому що щось можна зробити в PowerShell, це не робить його корисним . Практичність використання глибша, ніж здатність, і це те, на що я схильний зосереджуватися, намагаючись використовувати продукт як споживача.


Увімкнути режим QuickEdit? Виберіть та натисніть клавішу Enter, щоб скопіювати, ctrl-v для вставки, не більше Правка-> Позначити або Редагувати-> Вставити. Перебуваючи в налаштуваннях, встановіть положення вікна та зніміть позначку "нехай вікно положення системи". Завершення вкладки - це не просто заповнення шляхів файлової системи, це також заповнення імен змінних, імен команд, властивостей об'єкта. Ви, можливо, збираєтесь набрати .або [отримати доступ до властивості чи індексу, тому він не може просто додати роздільник шляху в кінці. Який саме PowerShell wget? Який PowerShell POSIX? Це не намагається піднести інструменти gnu до Windows або бути bash-сумісним btw.
TessellatingHeckler

Так, я знаю, що це не намагається бути баш. Я утримався сказати це в оригінальній публікації. Я б сказав, який з них стане двійковим, але немає команди "котрий" в оболонці живлення :( я не пригадую, де купувати я читаю потужність Shell повинен був бути сумісний з POSIX
ThorSummoner

5
re: "ні який" -> (get-command wg*.exe).Path. Re: завершення та читати лінійку -> 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, сортування, 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 були настільки банальними, що були нікчемними.

EDIT Heh, звичайно, як тільки я написав це, я поцікавився ще деяким і виявив те, чого я пропустив: -recurseопція для команди delete element є помилковою (виявляється, якщо ви використовуєтеget-help remove-item -detailed ).

Я намагався "delete-item -filter '* .xyz' -recurse", і він не працював, тому я відмовився від цього.

Виявляється, потрібно використовувати get-childitem -filter '*.xyz' -recurse | remove-item


16
Я думаю, що ви плутаєте хост сценарію Windows (WSH) з PowerShell. Вони зовсім інші.
Ерік Функенбуш

3
Наприклад, якщо ви хочете видалити всі файли, які закінчуються в .TMN, ви можете випустити цю команду get-childitem c: \ -include * .TMN -recurse | foreach ($ _) {
delete

@Mystere: Я спробував це, але, схоже, не вийшло. Після деякого ф'юшингу, здається, що * .tmn - це те, що вам потрібно (замість просто .tmn)
redtuna

5
Я не могла з повагою погодитися більше, і я аж ніяк не хлопець Windows. Я вважаю PS набагато простіше сценарію, ніж bash. PS більш послідовний. З Bash, будь-яка утиліта консолі, яку ви викликаєте, має свій синтаксис та унікальну поведінку, а сам синтаксис bash є доволі виразним. PS набагато надійніший з такими мовними функціями, як анонімні функції (блокування сценаріїв), валідація параметрів, розширені функції тощо. В основному, найбільша причина - це те, що ти завжди чуєш про PS, що козирять текст. Хоча Bash все ще швидший.
користувач2233949


0

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


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

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

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

@Xepoch - Справа в тому, що ви можете вибрати, яким саме способом ви хочете це зробити. Ви можете використовувати все добро вбудованої оболонки, або можете ігнорувати та робити так, як це робить Unix. Це твій вибір. І вибір хороший, правда?
Ерік Функенбуш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.