PowerShellはWindowsでCygwinシェルを置き換える準備ができていますか?[閉まっている]


384

PowerShellを学ぶべきか、それとも単にCygwin / Perlスクリプト/ Unixシェルスクリプトなどを使うべきかについて議論しています

PowerShellの利点は、Cygwinを持たないチームメートがスクリプトをより簡単に使用できることです。しかし、本当に多くの汎用スクリプトを書いているのか、それとも人々がそれらを使用するのかさえわかりません。

Unixスクリプティングは非常に強力ですが、PowerShellは切り替えを保証するのに十分近づいていますか?

以下は、PowerShellで探している具体的なもの(または同等のもの)の一部です。

  • グレップ
  • ソート
  • uniq
  • Perl(PowerShellはPerlの機能にどの程度近づくのですか?)
  • AWK
  • sed
  • file(ファイル情報を提供するコマンド)

7
Powershellを入手することに興味があり、このページを見つけたので、PSと慣れているシェルスクリプトの一般的な違いがわかりました。
Bender the Greatest

5
この投稿は、HNリンク送信の灰から突然上昇しました。すごい仕事。@Bobbyがこれを建設的ではないものとしてクローズしたことは悪いことです。
シド

26
あるツールが別のツールの機能をどれだけうまく複製できるかを誰かが質問できない場合、SOはツール比較の質問に答えることができません。これは論争を避けるために注意深く書かれていますが、単にUnix対Windowsの質問のように見えるために「論争の的」であると推定されて不注意でした。そして、事実上の客観的な答えを得て、WindowsでのUnixスクリプトの有用性についての事実上の洞察を追加しました。
チェルネビク

16
なぜこれがまた閉じられているのですか?誰かがタイトルを編集して「Windowsプラットフォーム上のPowerShell vs Unix Shells」と言って、トロールを「Windows vs Unix」として扱わないようにしてください。これは完全に建設的な質問です-再開に投票しました。
x0n 2012

3
opは、ツールとシェルを混合しています。PowerShellには用途があります。しかし、GNUは、Windowsを含む他のOSにUNIXの利点を自由にもたらすためのプロジェクトです。opが提供するリストのすべてのものには、Windowsでのgnu実装があります。GnuWin32または個々のサイトからアクセスできます。Windows BATは役に立たないわけではなく、リダイレクトとパイプと条件があります。
MeaCulpa 2012年

回答:


783

ツールは単なるツールです。
彼らは役立つか、そうではありません。
あなたは助けが必要か不要か。

Unixを知っていて、それらのツールがWindowsで必要なことを実行している場合は、あなたは幸せな人であり、PowerShellを学ぶ必要はありません(探索したい場合を除きます)。

私の当初の目的は、Windowsに一連のUnixツールを含めてそれを実行することでした(チームの私たちの多くは、深いUnixの背景とそのコミュニティへの健全な敬意を持っています)。

私が見つけたのは、これは実際にはあまり役に立たないということです。その理由は、AWK / grep / sedがCOMWMIADSI、レジストリ、証明書ストアなどに対して機能しないためです。

言い換えれば、UNIXはテキストファイルを中心に自動調整されるエコシステム全体です。したがって、テキスト処理ツールは効果的な管理ツールです。Windowsは、APIとオブジェクトを中心に自動調整された完全に異なるエコシステムです。それが、PowerShellを発明した理由です。

あなたが見つけると思うのは、テキスト処理ではWindowsで必要なものが得られない場合がたくさんあるということです。その時点で、PowerShellを取得する必要があります。注-それはオール・オア・ナッシングの取引ではありません。PowerShell内で、Unixツールを呼び出すことができます(テキストツールまたはPowerShellのテキスト処理を使用します)。また、UnixツールからPowerShellを呼び出してテキストを取得することもできます。

繰り返しますが、ここには宗教はありません。私たちの焦点は、成功に必要なツールを提供することです。だからこそ、フィードバックに情熱を傾けています。私たちが仕事に落ちているところや、必要なツールがないところを教えてください。リストに載せてそれを取得します。

正直なところ、30年の穴から自分自身を掘り起こしているので、しばらく時間がかかります。とはいえ、Windows Server 2008 / R2のベータ版やサーバー製品のベータ版を入手した場合、その穴がどんどん埋められることに驚かれると思います。

使用状況については、これまでに350万回以上ダウンロードされています。オプションのコンポーネントとして含まれており、ダウンロードする必要がないため、Windows Server 2008で使用している人は含まれていません。

V2はすべてのバージョンのWindowsに同梱されます。これは、オプションコンポーネントであるServer Coreを除くすべてのエディションでデフォルトでオンになります。Windows 7 / Windows Server 2008 R2の出荷直後に、Windows XP以降のすべてのプラットフォームでV2を利用できるようにします。言い換えると、学習への投資は、非常に多くのマシン/環境に適用できます。

最後のコメント。PowerShellの学習を始めたら、きっとあなたはとても幸せになると思います。設計の多くは、Unixの背景に大きく影響されているので、かなり異なりますが、すぐに理解できます(Unixでないことを理解してから:-))。

私たちは人々が学習のための非常に限られた予算を持っていることを知っています-それが私たちが一貫性について超ハードコアである理由です。何かを学び、それを何度も何度も使用します。

実験!楽しい!従事!


11
ご回答有難うございます。PowerShellについて学習していきます。これまで見てきたことからパワフルに見え、仕事でそれを使ってもっと便利なスクリプトを書くことができるでしょう。
アンディホワイト

55
@ジェフリー:Windows用のより良い端末のチャンスはありますか?Powershellは強力なスクリプト言語ですが、cmd.exeで実行されるため、対話モードでより便利になります
sumek

47
この「建設的ではない」質問は、「Unixではすべてがファイルである」というマントラ全体、およびWindowsが異なる理由について私が見た中で最高の洞察を生み出しました。たぶん、StackOverflowは建設的なディスカッションではなくクローズの方が良いでしょうか?
チェルネビク

12
@sumek-ConEmuを試してみてください。私は数週間のためにそれを使用してきた、それはかなり甘いです:hanselman.com/blog/...
EZハートを

4
気をつけてください。Powershellはバイナリデータのパイプ処理を好みません。信頼できるUnixツールを呼び出すときは注意してください。PowerShellでtar -c . | gzip > package.tar.gz 直接操作するようなことをしないでください。brianreiter.org/2010/01/29/…を
記事間

123

グレップ

Select-Stringコマンドレットと-matchオペレーターは正規表現で動作します。また、.NETの正規表現サポートを直接利用して、より高度な機能を利用することもできます。

ソート

Sort-Objectより強力です(* nixを覚えているよりもsort)。任意の式でマルチレベルのソートを許可します。ここでは、基礎となる型のPowerShellのメンテナンスが役立ちます。たとえば、DateTimeプロパティはソートDateTime可能な形式にフォーマットすることを保証する必要なしにとしてソートされます。

uniq

Select-Object -Unique

Perl(PowerShellはPerlの機能とどれくらい近いのですか?)

Perlのドメイン固有のサポートライブラリの幅に関しては、どこにも近い(まだ)。

一般的なプログラミングでは、PowerShellは確かによりまとまりがあり、一貫性があり、拡張が容易です。テキスト変更の1つのギャップは、Perlの..演算子と同等のものです。

AWK

AWKを使用してから十分な時間が経過しているため(18年以上でなければなりません。後でPerlを使用したためです)、コメントすることはできません。

sed

[上記を参照]

file(ファイル情報を提供するコマンド)

ここでのPowerShellの強みは、ファイルシステムオブジェクトで実行できるものとはあまり違いません(ここで完全な情報を取得したり、dir返しFileInfoたり、FolderInfo必要に応じてオブジェクトを。それは、プロバイダーモデル全体です。

レジストリ、証明書ストア、SQL Server、Internet ExplorerのRSSキャッシュなどを、ファイルシステムと同じコマンドレットでナビゲート可能なオブジェクトスペースとして扱うことができます。


PowerShellは間違いなくWindowsでの前進です。マイクロソフトは、これを将来の非ホーム製品に対する要件の一部にしました。したがって、Exchangeでの豊富なサポート、SQL Serverでのサポート。これは拡大するだけです。

この最近の例はTFS PowerToysです。多くのTFSクライアント操作は、毎回tf.exeを起動することなく実行され(新しいTFSサーバー接続などが必要)、特にデータをさらに処理することが特に容易になります。また、TF.exeのいずれかのチームエクスプローラーで公開されるよりも詳細に、TFSクライアントAPI全体への幅広いアクセスを許可します。


2
重要なのは、OSがユニバーサル構成メディアとしてテキストを使用しないためだけにプロバイダーモデルが興味深いため、これらのプロバイダーが必要になるということです。UNIXでは、ほとんどの言語にPAM、ホスト、およびパッケージを操作するためのAPIがありますが、最終的にはテキストが常に存在します。
Daishiman

12
テキストは常にすべてに最適な形式であるとは限りません(データベースとラスターイメージから始めます)。しかし、オープンフォーマットの戦争ではなく、反対することに同意できると思います。
リチャード

5
Powershellは.NETフレームワークの任意のオブジェクトを使用できますが、これはPerlのドメイン機能と一致しませんか?さらに、再利用が必要な場合は、C#などでコマンドレットを記述できます
Chris S

ポイントごとの比較。良いですね。これは受け入れられる答えになるはずです。PowerShellの強みは、.NETの基盤と、新しいコマンドレットを記述したり、クラスライブラリを呼び出したりすることでシステムを簡単に拡張できることにあります
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{};}
Nathan Chappell

56

1997年から2010年までのWindowsエンタープライズ開発に焦点を当てた人物として、明白な答えは以前に与えられたすべての十分な理由からPowerShellになるでしょう(たとえば、それはMicrosoftのエンタープライズ戦略の一部であり、Windows / COM / .NETとうまく統合されます)。ファイルの代わりにオブジェクトを使用すると、「よりリッチな」コーディングモデルが提供されます。そのため、私は過去2年間、PowerShellを使用および宣伝してきましたが、私は「Word of Bill」に従っていたことを明確に信じていました。

ただし、実用主義者として、PowerShellがこれほど優れた答えであるとは思えません。これは優れたWindowsツールであり、ウィンドウのコマンドラインである歴史的な穴を埋めるために非常に必要なステップを提供しますが、コンシューマーコンピューティングのスリップに対するMicrosoftのグリップを見ると、MicrosoftがOSを維持するために大規模な戦いを繰り広げている可能性が高まっているようです。未来の企業にとって重要です。

確かに、異機種混在環境での作業がますます増えていることを考えると、BashスクリプトはLinux、Solaris、Mac OS Xで機能するだけでなく、 WindowsでのCygwinのヘルプ。

したがって、OSの将来は独占ではなくコモディティ化されているという信念に賛同するなら、実現可能な場合は独自のツールから遠ざけるアジャイル開発ツール戦略を選択することは理にかなっているようです。しかし、あなたが将来すべてがレドモンドに支配されているのを見たなら、PowerShellに行きましょう。


1
UNIXスクリプトはCygwin-Windowsでエラーなしに完全に機能しますか?
Pacerier、2015年

@Pacerier CygwinとMinGWを12年間使用していて、驚くほどまれに問題がありました。重要なことは、何かがうまくいかなくても、常にWindowsツールなどに頼ることができるということです。他のシェルが起動するのと同じ方法でプロセスを起動できます。
Evgeni Sergeev 2016年

4
さて、あなたの答えは2011年からです。今日、PowershellはLinuxでも動作します。そして-私の個人的な意見-bashは古すぎる。構文はひどいので、別のスクリプト言語を使用したいと思います。最近では、ほとんどのLinuxディストリビューションでPythonが標準となっているため、スクリプトにbashを使用する理由はありません。2011年以来多くのことが起こっているので、もう一度powershellをチェックすることをお勧めします。
。– itmuckel


33

スクリプトの自動化にPowerShellを少し使用しました。環境がUnixシェルよりもはるかに考え抜かれたように見えるのはとても良いことですが、実際には、テキストストリームの代わりにオブジェクトを使用するのははるかに不格好であり、過去30年間に開発された多くのUnix機能年はまだ不足しています。

Cygwinは、依然としてWindowsホストに最適なスクリプト環境です。それは確かに物事を成し遂げるという点で他の選択肢よりも優れています。


27
オブジェクトの使用はパラダイムシフトであり、慣れるまでに時間がかかります。ただし、構造化データが関与する各ステップでの全体的な再解析は回避されます(たとえば、フィールドが区切られていることを確認する必要はありません)。
リチャード

16
@Andy White @ Daishiman、PowerShellで学習曲線があるところは理解できますが、オブジェクトのパイプはテキストのパイプよりもはるかに柔軟です。@Richardは正しいです。:)
Steven Murawski、

18
自動車メーカーも、1000年以上の馬との議論に苦労しました。私は軽蔑することを試みていません。過去の成功はイノベーションの潜在的な利益を取り除かないことを指摘するだけです。
EBGreen

12
@daishiman-オブジェクトの利点は、プロパティが必要なときにそれを要求することです。解析、推測、キャストする必要はありません。「オブジェクトに互換性のあるメソッドがないとどうなるか」についてのあなたの意見は理解できませんでした-別の言い方をしたり、問題の例を挙げたりできますか ありがとう。
Jeffrey Snover-MSFT 2009年

13
@Daishiman-わかりました。実際には、これは問題ではなく、非常に大きな利点であることがわかりました。とはいえ、あなたがエキスパートのテキストパーサーである場合、これは新しいスキルを習得する必要があり、最初は不要で扱いにくいと感じるかもしれません。繰り返しますが、役立つものは何でも正しいツールです。
Jeffrey Snover-MSFT 2009年

15

ここには多くの素晴らしい答えがあり、ここに私の見解があります。準備ができていれば、PowerShellの準備は整っています...例:

grep = " Select-String -Pattern "

sort = "Sort-Object"

uniq = " Get-Unique "

file = " Get-Item "

cat = " Get-Content "

Perl / AWK / Sedはコマンドではありませんが、ユーティリティなので比較するのは困難ですが、PowerShellでほぼすべてを実行できます。


2
私たちの祖先が使用を余儀なくされた不可解な4文字のコマンドを信じられますか?
Evgeni Sergeev

4
@EvgeniSergeevすべて上記のように、デフォルトで使用可能ですslssortgugigcそれぞれ。1つのシステムでタブ補完できる長く読みやすい名前と、入力可能な短い名前。それはあなたにとってユーザーフレンドリーな進歩です。
TessellatingHeckler 2017

のエイリアスの1つはGet-Contentですcat。そのため、Cygwin / UnixとPowerShellの間に違いはありません。残念ながら、ほとんどの場合、コマンドレットに関するMicrosoftのドキュメントにはエイリアスに関する情報が不足していますが、PowerShellセッションで使用Get-Aliasすることにより、すべてのエイリアスのリストが出力されます。"Get-Unique"のエイリアスは "gu"なので、Cygwin / Unixのエイリアスよりも短いです!
Peter Mortensen

13

つい最近まで、PowerShellを真剣に取り組んでいます。過去7年間、ほぼ独占的にWindowsベースの環境で働いてきましたが、私はUnixの出身で、Windowsでの対話エクスペリエンスを常に「Unixに適合」させようとしていることに気づきました。控えめに言ってもイライラします。

grepsedawkfindなどのユーティリティは厳密にはシェルの一部ではないため、PowerShellをBashtcsh、またはzshなどと比較するのは公平です。ただし、それらは常に任意のUnix環境の一部になります。といえ、Select-StringのようなPowerShellコマンドgrepと非常によく似た機能を備えており、PowerShellのコアモジュールとしてバンドルされているので、線が少し不明瞭になる可能性があります。

重要なのは文化であり、それぞれのツールセットがそれぞれの文化を具現化するという事実です。

  • Unixは、ファイルベースの(一般的には非Unicode)テキストベースの文化です。構成ファイルは、ほとんどがテキストファイルです。一方、Windowsは常に構成フォーマットに関してはるかに構造化されています。構成は通常、管理のために専用のツールを必要とする独自のデータベース(Windowsレジストリなど)に保持されます。
  • Unixの管理(そして何年もの間、開発)インターフェースは伝統的にコマンドラインと仮想端末でした。Windowsは、GUIとしてスタートし、管理機能は、ごく最近のことから離れて移動を開始している専用の GUIベースの。コマンドラインでのUnixの経験は、PowerShellでの重要なリードを考えると、よりリッチで成熟したものになると期待でき、私の経験はこれと一致します。これについて、私の経験では:

    • Unixの管理経験は、最小限のキー操作で物事を簡単に行えるようにすることを目的としています。これはおそらく、低速の9600ボーダイヤルアップ接続でサーバーを管理する必要があったという歴史的な状況の結果です。PowerShellにはエイリアスがあり、かなり冗長なVerb-Noun標準を回避するのに長い道のりがありますが、それらのエイリアスを知るのは少し面倒です(誰もが知っている以上のことを知っていalias | where {$_.ResolvedCommandName -eq "<command>"}ますか?)。

      履歴を操作できる豊富な方法の例:

      iptablesコマンドは長い時間がかかることが多く、Bashに組み込まれた履歴操作の多くのきちんとした機能の1つだけではない場合は、次のようなiptablesルールを挿入するのが面倒です。

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

      別のカメラ( " camera-2")の2回目は、次のように発行します。

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

      つまり、「前のコマンドを実行しますが-1--2-50で置き換え51ます。

    • Unixエクスペリエンスはタッチタイピスト向けに最適化されています。「ホーム」ポジションを離れることなく、ほとんどすべてを行うことができます。たとえば、Bashでは、Emacsキーバインディングを使用して(そう、Bashはviバインディングもサポートしています)、履歴の循環はを使用Ctrl-PCtrl-Nて行われ、行の先頭と末尾への移動はそれぞれとを使用Ctrl-Aして行われCtrl-Eます...終わらない。ホームポジションから移動せずに、PowerShellコンソールで最も簡単なナビゲーションを試してみてください。

    • Unixでの多目的ページング(la la less)のような単純なものは、PowerShellですぐに使用できるようには見えません。これは、少しイライラし、リッチなエディターエクスペリエンスも存在しません。もちろん、いつでもそれらのギャップを埋めるサードパーティのツールをダウンロードできますが、これらがUnixのほとんどの種類にあるような「存在」したものであるなら、それは素晴らしいことです。
  • Windowsカルチャは、少なくともシステムAPIの観点からは、高度に構造化され、オブジェクトベースである、サポートするフレームワーク、つまりCOM.NETによって大きく推進されています。一方、Unix APIへのアクセスは、伝統的にファイルインターフェイス(/devand /proc)または(非オブジェクト指向)Cスタイルのライブラリ呼び出しを介して行われていました。その場合、スクリプトエクスペリエンスがそれぞれのOSパラダイムと一致するのは当然のことです。PowerShellは本質的に構造化されており(すべてがオブジェクトです)、Bashとその仲間のファイルベースです。PowerShellプログラマーが自由に使用できる構造化APIは膨大です(基本的に、既存の標準COMおよび.NETインターフェイスのセットの広大さに一致します)。

つまり、PowerShellのスクリプト機能はBashよりも間違いなく強力ですが(特に.NET BCLの可用性を検討する場合)、インタラクティブなエクスペリエンスは大幅に低下します(特に、完全にキーボード駆動型の場合)。 、コンソールベースのパースペクティブ(多くのUnixヘッドと同様)。


あなたは「誰かが何かより良いことを知っている:エイリアス| where {$ _。ResolvedCommandName -eq "<command>"}?」と尋ねます。ちょうどalias -Definition *property(または他のパターン)はどうですか?私はあなたの答えの問題はあなたがシェルとコンソールを融合していることだと思います:異なる編集オプションを備えたコンソールの選択肢があることを思い出してください。彼らはDOSコンソールの編集を意図的に壊したままにし、人々にISEなどの他のコンソールを使用するように促しました。
ダンカン

ところで、あなたの!!例はPowershellで書くことができますが、(h -c 1) -replace '-1-','-2-' -replace '50','51' | iex上矢印キーを押して単一のコマンドを編集する方が簡単です。多くのコマンドで実行したい場合は、Powershellが勝つと思います。編集でコマンド#255で終わる10個のコマンドを繰り返すには:(h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iexPowershellの履歴では、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
Eric Smith

8

私は決してPowerShellの経験が豊富ではありませんが、目に触れたことのほんの一部に感銘を受けました。組み込みコマンドレットを一緒にチェーンして、Unixプロンプトで実行できるほとんどすべてのことができます。CSV、HTMLテーブルへのエクスポートなど、さらに詳細なシステム管理タイプのジョブには、いくつかの優れた点があります。 。

また、本当にsedのようなものが必要な場合は、常にUnixUtilsまたはGnuWin32があり、PowerShellとかなり簡単に統合できます。

長い間Unixを使用していたため、コマンドの命名体系に慣れるのに少し苦労しました。.NETをもっと知っていれば、その恩恵を受けられるはずです。

したがって、本質的に、Windowsのみの問題で問題が発生しない場合は、それを学ぶ価値があると私は言います。


1
Monoを介して他のプラットフォームでPowerShellを実行できるオープンソースプロジェクト「Pash」があります。 tinyurl.com/6dyoso
ジョンD.クック

うわあ!先端をありがとう; 私はそれを試してみるのが
待ち遠しい

6

シェルスクリプトが好きなら、PowerShellが気に入るはずです。

Microsoft Command Shell(Ars Technica)のガイド付きツアーから始めます。


8
私はシェルスクリプトが大好きで PowerShell を許容しています。コマンドと構文はひどいです。便利なコマンド補完なしの恐ろしく長いコマンドオプション。または、私はそれを見つけていません。分離する必要がある単一のコマンドに詰め込まれた機能が多すぎます。奇妙な変数とエスケープ構文は、DOSバッチプログラマのみが愛することができます。
Zan Lynx

8
@ザンリンクス-あなたはものを見つけていないことについて正しいです。すべてのコマンドにはエイリアスがあり、それらの多くはDOSコマンドとUNIXコマンドの両方に一致します(ps、dir、rm、ls、k​​ill、history、man、cat、clearなど)。名前は長く、意味のある名前になります。スクリプトに最適-新しい人がスクリプトを使用および保守する必要がある場合に役立ちます。コマンドレット、関数、変数、パス、パラメーターなどのタブ拡張があります。構文の多くはUnixシェルからのものであり、エスケープ構文とは何ですか。``はWindowsのパス区切り文字であるため、エスケープには使用されません。
manojlds

3
@Zan Lynx-引数が無効です。変数の解釈を停止するには、'(一重引用符)を使用します。二重二重引用符についても、同じように使用しますwrite-output 'this is a "test"'。あなたが指摘している質問は正規表現に関するものであり、正規表現のエスケープはどこでも有効です。Powershellには、ヒア文字列/逐語的文字列もあります。Javaにもこれらはありません!Javaで正規表現をエスケープしてみてください。そして、あなたは時々literalpathを使いません。必要なときに使用します。LiteralPathはワイルドカード文字をそのまま扱い、展開しません。あなたのファイルがそれを持っているとき、あなたはそれを使います。それはあなたに多くのオプションを提供します。
manojlds 2011

3
@manojlds:bashシェルと比較して、Powershellには意味がなく混乱しているだけの不整合がたくさんあります。bashではどこでも同じエスケープ文字を使用し、ファイルパスは文字列と同じようにエスケープします。特別なパラメーターは必要ありません。特殊文字が含まれている変数を展開する場合は、その変数を二重引用符で囲みます。内容は安全であり、関数を呼び出して再エスケープする必要はありません。
Zan Lynxは、

5
@Zan Lynx-矛盾はありません。でもwrite-output "this is a `"test`""動作します。``\`の代わりに使用してください。regex :: escapeは、エスケープを逃さないようにするために存在します。使用する必要はありません。あなたはあなたを助け、間違いを防ぐためにそこにある追加のオプションは矛盾していると考えています。
manojlds 2011

6

最近の実験で、PowerShellと.NETの呼び出しの奥深くに導いたので、PowerShell CygwinとUnixシェルを置き換えることができると言わなければなりません。

Perlについてはよくわかりませんが、PowerShellとPerlの両方がプログラミング言語として完全なチューリングであるため、Perlを置き換える場合にもこれを「はい」として提供します。

PowerShellがCygwinおよび* nixの下の通常のBashよりも優れている点の1つは、サンドボックス化されたDLL呼び出しを実行し、直接API呼び出し、WMIメソッド、さらにはCOMオブジェクトを介してオペレーティングシステムを操作できることです。コードを介してInternet Explorerを起動し、表示されたドキュメントを使用して必要な処理を行い、Webサーバーのバックエンドを効果的にエミュレートするのはどうでしょうか。

SQLサーバーや他のデータプロバイダーからデータを収集し、それらを解析して、CSV、メールメッセージ、テキスト、および実際にはあらゆる種類の既存および存在しないファイル形式としてエクスポートしませんか?(もちろん、受け取ったデータから有効なファイルを作成する適切なスキルがありますが、CSVはすぐに利用できます)。

また、署名されたコマンドレットとスクリプト、グループポリシー、および実行ポリシーを介して利用できる追加のセキュリティがあり、管理者として実行した場合でも、悪意のあるコードがシステムで実行されるのを防ぎます。

どのコマンドが実装されているかについて-Richardの答えは、それらと、それらの機能をすでにエミュレートするPowerShellの機能をリストしています。

PowerShellが切り替えを保証するのに強いかどうか-これは個人的な好みの問題ですが、Windowsサービスがそれらを制御するためのPowerShellコマンドレットを提供するようになるにつれて、これらのサービスが存在する状態でPowerShellを使用しないことは妨げと見なされます。(Hyper-Vサーバーは、このような主要なサービスであり、GUIよりもPowerShellコマンドレットでより多くの機能を提供します!)

おそらくこの回答は5年遅れですが、それでも、誰かがWindowsで管理タスクやさまざまなものの一般的なスクリプトを実行する場合は、目的に合わせてPowerShellを活用してみてください。


6

PowerShellをCygwin / Perl / Shellの組み合わせと比較する場合、PowerShellはその組み合わせの「シェル」部分のみを表すことに注意してください。

ただし、cmd.exeまたはCygwinから行うように、PowerShellから任意のコマンドを呼び出すことができます。それはないない指定された機能を再実装し、それは確かにPerlのを比較することはできません。

これは「単なる」シェルですが、.NETユニバースへの快適なインターフェイスを提供してプログラミングを容易にします。

また、PowerShellにはWindows XP、Windows Server 2003以降が必要であり、ITインフラストラクチャによっては問題が発生する可能性があることにも注意してください。

更新:

私の答えがどのような哲学的な議論になるのか、私にはわかりませんでした。

PowerShellをCygwinおよびPerlとBashと比較してください。

PowerShellはシェルであり、組み込みコマンド、コマンドレット、ユーザー関数、および外部コマンド(.exe、.bat、.cmd)の間に構文上の違いはありません。呼び出しで名前空間またはオブジェクトを追加することで異なるのは、.NETメソッドの呼び出しのみです。

そのプログラマビリティは、.NETフレームワークから派生したものであり、PowerShellの「言語」に固有のものではありません。

BugzillaまたはMediaWikiがWebサーバーで実行されるPowerShellスクリプトとして実装されるとすぐに、PowerShellは「スクリプト言語」であると私は思います。

それまでは、比較をお楽しみください。


そうですね、Unixの「シェル」について話しているときは、grepやawkなど、Unixに付属しているすべての通常のユーティリティについても言及していると思います。 -ボックス。
アンディホワイト

3
Powershellは「単なるシェル」ではありません。それはスクリプト言語です。それはどのようにしてperlに匹敵しないのでしょうか?それほど成熟していないことは認めますが、それ以上に格差はありません。
EBGreen、2009

@EBGreen、このコメントはどういう意味ですか?シェルまたはスクリプト言語は本質的に類似していることに同意しますが、PowerShellとbash / perl /他のUNIXシェル/スクリプト言語の特定の機能についてもっと知りたいと思っていました。
アンディホワイト

2
Powershellには、信じられないほど幅広い機能があります。それは-対話型で合成可能なシェル-豊富な対話型スクリプト言語-プログラミング言語OOとtesxtユーティリティ関数(つまり、grep / awk / etcと同等のもの)の豊富なセットも備えています。
Jeffrey Snover-MSFT 2009年

1
@Andy-PowershellはPerlほど強力ではないというDevioを理解しました。私はそれが真実であるとは信じていません。なぜ彼がそうであると彼が思ったのか疑問に思いました。
EBGreen、2009

4

PowerShellのコマンドレットは非常に優れており、確実に動作します。私はJava / C#開発者なので、オブジェクト指向性は私にとって非常に魅力的ですが、完全なセットではありません。オブジェクト指向であるため、POSIXツールセットのテキストストリーム成熟度の多くを見逃していますawkそしてsedいくつか挙げる)。

OOテクニックを愛し、POSIXツールの成熟度を愛するというジレンマに対して私が見つけた最良の答えは、両方を使用することです!PowerShellの優れた点の1つは、オブジェクトを標準ストリームにパイプする優れた機能を備えていることです。PowerShellはデフォルトでオブジェクトパイプラインを使用してオブジェクトを転送します。これらは標準ストリーム(標準出力、標準エラー、標準入力)ではありません。PowerShellがオブジェクトパイプラインを持たない標準プロセスに出力を渡す必要がある場合、最初にオブジェクトをテキストストリームに変換します。PowerShellはこれをうまく行うので、POSIXツールをホストするのに最適な場所です!

最高のPOSIXツールセットはGnuWin32です。インストールには5秒以上かかりますが、問題はありません。私の知る限り、システムを変更することはありません(レジストリ、c:\windows\*指定したディレクトリにファイルをコピーすることを除いて、フォルダーなど)を。共有ディレクトリにツールを配置すると、多くの人がそれらに同時にアクセスできるため、これは非常に便利です。

GnuWin32インストール手順

exeをダウンロードして実行(SourceForgeサイトから)して、適切なディレクトリを指定します(私はを使用しますC:\bin)。GetGnuWin32実行するディレクトリがそこに作成されdownload.bat、その後install.bat(パラメーターなしで)、C:\bin\GetGnuWin32\gnuwin32\binWindowsマシンでこれまでに存在した中で最も有用なフォルダーであるディレクトリが作成されます。そのディレクトリをパスに追加すると、準備が整います。


4

TL; DR-WindowsやPowerShellは嫌いではありません。WindowsやPowerShellでは何もできませ


個人的には、PowerShellはせいぜい圧倒されます。

  • ディレクトリパスのタブ補完は複合されないため、ユーザーは名前が補完されるたびにパス区切り文字を入力する必要があります。
  • Windowsがさえパスのか、パスが何であるかという概念を持っていないように私はまだアクセスできるユーザーのホーム・インジケータで、感じて~/、いくつかの短いです@environment://somejibberish/%user_home%
  • NTFSはまだ混乱しており、一見常に混乱しているようです。幸運をナビゲートします。

  • cmd-esqueインターフェイス、恐竜のcmd.exeはPowerShellで引き続き表示されます。編集マークは、情報をコピーする唯一の方法であり、表示されるターミナルスペースの長方形のブロックの形でのみコピーします。そしてEditMarkは文字列をターミナルに貼り付ける唯一の方法です。

  • 青色に塗っても、それ以上魅力的にはなりません。けれども、マイクロソフトの開発者が色の好みを持っていることは気にしません。

  • ウィンドウは常に画面の左上隅で開きます。垂直のタスクバーを使用する人にとって、これは非常に煩わしいです。特に、Windowsタスクバーがウィンドウのコピー/貼り付け機能へのアクセスを提供する唯一のコーナーをカバーすることを考えると、これは非常に迷惑です。

Windowsに含まれているツールを理由に、私はあまり話せません。オープンソースで自由にライセンスされたCLIツールのセットがすべてあり、PowerShellには私の知る限りではどれもまったくがっかりすることはありません。

  • PowerShell wgetは、GNU wgetに対して一見比類のない引数を取ります。ありがとう、移植性のない役に立たない希望のかすかな光。
  • PowerShell POSIXはBashと互換性がなく、特に&&演算子は処理されないため、以下の最も単純な条件付きコマンドは実行されません。

私は人を知りません。私はそれに打撃を与えました、私は本当にしました。私はまだそれを試してみて、次にそれを開いたときにそれが役に立たなくなることを期待しています。PowerShellでは何もできません。また、実際のプロジェクトでは、GNUツールをWindowsに導入することはほとんどできません。

MySysGitは、いくつかのGNUツールを備えた恐竜のcmd.exeプロンプトを表示します。それでも非常に圧倒されますが、ついにパスの完成が機能します。そして、GitコマンドはGit Bashで実行されます。

Mintty for MySysGitは、mysysgitの環境にCygwinインターフェースを提供し、コピーと貼り付けを行います(コピー(マウス)を選択、貼り付けるにはShift+ Ins、最新の方法...)。しかし、git pushMinttyのようなものは壊れています。

私は不平を言うつもりはありませんが、Cygwinのようなツールを与えられたとしても、Windowsでのコマンドラインの使いやすさには依然として大きな問題があります。


PS:PowerShellで何かを実行できるからといって、それが使用可能になるわけではありません。使いやすさは能力よりも深く、消費者として製品を使用しようとするときに私が重点を置く傾向があるものです。


QuickEditモードをオンにしますか?選択してEnterキーを押してコピーし、Ctrlキーを押しながらVキーを押して貼り付けます。編集->マークまたは編集->貼り付けは必要ありません。環境設定で、ウィンドウの位置を設定し、「システム位置ウィンドウを開く」のチェックを外します。タブ補完は、ファイルシステムパスを補完するだけでなく、変数名、コマンド名、オブジェクトプロパティも補完するため、プロパティまたはインデックスを入力.または[アクセスしようとしている可能性があるため、末尾にパス区切り文字を追加することはできません。正確にはどのPowerShellウィジェットですか?どのPowerShell POSIXですか?それは、gnuツールをWindowsに持ち込もうとしたり、bash互換にしようとしたりするものではありません。
TessellatingHeckler 2014年

ええ、私はそれがバッシュになるつもりはないことを知っています。私は元の投稿でそう言うのを控えました。私が言うことになるワットGETバイナリしかし、誰があり、私はパワーを読んで買うシェルなっていた私は覚えていません:(パワーシェルのコマンドは、POSIX互換性があるように、「これ」
ThorSummoner

5
re: "いいえ"-> (get-command wg*.exe).Path。再:bash完了とreadline-> leeholmes.com/blog/2012/09/13/…github.com/lzybkr/PSReadLineにつながる
TessellatingHeckler

2

少なくともまだ、PowerShellが本当に普及したことは知りません。したがって、チームの他のメンバーがすでにそれを知っている場合を除いて、学習する価値はないかもしれません。

あなたの苦境については、他の人が遅れをとる可能性のあるスクリプト言語、あなたが述べたようなPerl、またはRubyやPythonのような他の人が良いでしょう。

多くのことはあなたが何をする必要があるかに依存すると思います。個人的に私は自分の個人用スクリプトにPythonを使用していますが、書き始めたときにそれを渡すことができないものを知っているので、あまりにも革新的なことはしないようにしています。


2

なぜ両方使用しないのですか?Perlなどの他の解釈済みスクリプトと同じように、CygwinでPowerShellスクリプトを呼び出します。

CygwinでBashラッパーがpowershell.exeを呼び出すためのhttps://bitbucket.org/jbianchi/powershellを書いたほど、これは十分に行えます。powershell.exe .ps1スクリプトの最初の行としてシバンとして使用できます(PowerShellはコメントとして「#」も使用するため)。例については、https://bitbucket.org/jbianchi/powershell/wiki/Homeを参照してください


1

数行で、CygwinとPowerShellは異なるツールですが、Cygwinがインストールされている場合は、PowerShellセッション内でCygwin実行可能ファイルを実行できます。私はPowerShellに慣れてきているので、grep、sort、awkなどを使用しなくなりました。PowerShellには組み込みの代替手段がかなりあります。そうでない場合は、そこにコマンドレットを見つけることができます。

私が使用している主なツールはssh.exeですが、PowerShellセッション内で使用しています。

それは素晴らしい働きをします。


0

PowerShellプログラミングは努力に値しないことがわかりました。

Unixでのシェルスクリプトの使用には数年の経験がありますが、PowerShellでほとんどのことを実行するのは非常に難しいことがわかりました。

多くの機能では、Windows管理インターフェイスに問い合わせて、SQLのようなコマンドを発行して必要な情報を取得する必要があるようです。

たとえば、ディレクトリツリーから特定のサフィックスを持つすべてのファイル削除するスクリプトを書きたかったのです。 Unixでは、これは簡単です...

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

周りのdicking数時間後Scripting.FileSystemObjectWScript.Shellし、「&ドライブ&「Win32_ShortcutFile WHEREドライブ= SELECT * FROM」発行『『ANDパス=』』&searchFolder&「」」、私は最終的にあきらめ、Windowsエクスプローラのために定住検索コマンドと手動で行うだけです。おそらく私がやりたいことを実行する方法はいくつかありますが、明らかなものは何も見当たらず、MSDNサイトのすべての例は非常に些細なものであり、役に立たないほどです。

編集へえ、もちろんこれを書いたらすぐにもう少し調べてみて、欠けていたものを見つけました。remove -recurse-itemコマンドのオプションに欠陥があります(を使用すると表示されますget-help remove-item -detailed)。

「remove-item -filter '* .xyz' -recurse」を試してみましたが、うまくいかなかったので、あきらめました。

使用する必要があることが判明 get-childitem -filter '*.xyz' -recurse | remove-item


16
Windows Scripting Host(WSH)とPowerShellを混同していると思います。それらはまったく異なります。
Erik Funkenbusch 2009

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、オブジェクトの切り捨てテキストについて常に耳にすることです。ただし、Bashの方が高速です。
user2233949 2015


0

PowerShellは非常に強力で、Unixシェルの標準ビルトインよりも強力です(ただし、通常はサブプログラムに組み込まれている機能の多くが含まれているためです)。また、あなたは含めて、任意の.NET言語でアプレットを書くことができることを考えるのIronPythonIronRubyのなど、PerlNet ..またはあなたは、単にすべての余分な機能を無視して、PowerShellのからあなたのCygwinのコマンドを呼び出すことができ、それがバッシュ、と同様に動作しますKornシェル、または何でも...


Unixシェルの設計目標を見逃しているかもしれません。PowerShellをノックするわけではありませんが(自分でもっと学びたいと思います)、そのようなステートメントを作成するには、Unixツールを理解する必要があります。
J 'Queue、2011

2
@Xepoch-いいえ、PowerShellの設計目標を見逃していると思います。PowerShellは、Unixシェルが実行できるのと同じ方法で、Unixシェルが実行できるすべてのことを実行できます。ただし、本当の力は、テキスト出力を解析するだけでなく、PSのオブジェクトパイピングシステムを利用するときに得られます。つまり、PowerShellはbashまたはkornが実行できることを正確に実行できますが、PowerShellが実行できることは実行できません。
エリックファンケンブッシュ、2011年

3
私はPowerShellを十分に理解していないため、批評を与えることはできませんが、Unixシェルの目標は、外部ツールの完全な包括的な置き換えではなく、その周りの制御構造である必要があります。繰り返しますが、現時点では比較も対照もできませんが、PowerShellの組み込みが多いため、PowerShellを上げることは必ずしもUnixシェルの恩恵ではありません。
J 'Queue、2011

@Xepoch-重要なのは、どの方法を使用するかを選択できることです。組み込みシェルのすべての優れた点を使用することも、Unixと同じように無視して実行することもできます。それはあなたの選択です。そして選択は正しいですよね?
エリックファンケンブッシュ、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.