ChatGPT解决这个技术问题 Extra ChatGPT

PowerShell 准备好在 Windows 上替换我的 Cygwin shell 了吗? [关闭]

关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 3年前关闭。改进这个问题

我正在争论我是应该学习 PowerShell,还是坚持使用 Cygwin/Perl 脚本/Unix shell 脚本等。

PowerShell 的好处是脚本可以更容易地被没有 Cygwin 的队友使用;但是,我不知道我是否真的会编写那么多通用脚本,或者人们是否会使用它们。

Unix 脚本如此强大,PowerShell 是否足够接近以保证切换?

以下是我将在 PowerShell 中寻找的一些特定事物(或等价物):

grep

种类

独特的

Perl(PowerShell 与 Perl 的功能有多接近?)

AWK

sed

文件(提供文件信息的命令)

等等

我不会这么说,我对拿起 Powershell 很感兴趣,找到了这个页面,现在我知道了 PS 和我习惯的 shell 脚本之间的一般区别。
这篇文章在 HN 链接提交中突然从灰烬中升起。做得好。对于@Bobby 来说,因为没有建设性而关闭它是不利的。
如果有人不能问一个工具复制另一个工具的功能有多好,那么 SO 就不能回答工具比较问题。这是为了避免争议而措辞谨慎,但只是因为看起来像 Unix 与 Windows 的问题而粗心地假定“有争议”。它得到了一个事实的、客观的答案,并且对 Unix 脚本在 Windows 上可能有多大帮助提供了额外的事实见解。
怎么又关门了?有人请编辑标题说“Windows 平台上的 PowerShell 与 Unix Shells”,以引导巨魔不要将其视为“Windows 与 Unix”,但事实并非如此。这是一个非常有建设性的问题——投票决定重新开放。
该操作是将外壳与工具混合在一起。 PowerShell 有它的用途。但是 GNU 是一个将 UNIX 的好东西自由地引入其他操作系统的项目,包括 Windows。 op 给出的列表中的每一件事在 Windows 中都有一个 gnu 实现。可从 GnuWin32 或个别站点访问。 Windows BAT 不是没用的,它有重定向、管道和条件。

P
Peter Mortensen

工具只是工具。他们提供帮助或不提供帮助。你需要帮助,或者你不需要。

如果您了解 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 中提供。除了作为可选组件的服务器核心之外,所有版本都将默认启用。在 Windows 7/Windows Server 2008 R2 发布后不久,我们将在所有平台(Windows XP 及更高版本)上提供 V2。换句话说 - 您在学习上的投资将适用于大量机器/环境。

最后一条评论。如果/当你开始学习 PowerShell,我想你会很高兴的。大部分设计都深受我们的 Unix 背景的影响,所以虽然我们完全不同,但你会很快学会它(在你不再抱怨它不是 Unix 之后:-))。

我们知道人们的学习预算非常有限——这就是为什么我们非常重视一致性。你会学到一些东西,然后你会一遍又一遍地使用它。

实验!享受!从事!


感谢您的回答。我想我会继续学习 PowerShell。从我目前看到的来看,它看起来很强大,而且我将能够在工作中使用它编写更多有用的脚本。
@Jeffrey:是否有机会为 Windows 提供更好的终端? Powershell 是一种强大的脚本语言,但它在 cmd.exe 中运行的事实使其在交互模式下更加方便
这个“不具建设性”的问题产生了我所见过的对整个“在 Unix 上一切都是文件”的口头禅以及 Windows 为何不同的最佳见解。也许 StackOverflow 会更好地结束非建设性的讨论?
@sumek - 试试 ConEmu;我已经使用它几个星期了,它非常棒:hanselman.com/blog/…
注意:powershell 不喜欢管道二进制数据。因此,当您调用可信赖的 Unix 工具时要小心,不要在 PowerShell 中执行tar -c . | gzip > package.tar.gz 直接 之类的操作,否则您会受苦。请参阅brianreiter.org/2010/01/29/…
P
Peter Mortensen

grep

Select-String cmdlet 和 -match 运算符使用正则表达式。您也可以直接利用 .NET 的正则表达式支持来获得更高级的功能。

种类

Sort-Object 更强大(比我记得 *nix 的 sort)。允许对任意表达式进行多级排序。在这里,PowerShell 对底层类型的维护有所帮助;例如,DateTime 属性将作为 DateTime 进行排序,而无需确保格式化为可排序格式。

独特的

Select-Object -Unique

Perl(PowerShell 与 Perl 的功能有多接近?)

就 Perl 的领域特定支持库的广度而言:远未接近(还)。

对于一般编程而言,PowerShell 无疑更具凝聚力和一致性,并且更易于扩展。文本修改的一个空白相当于 Perl 的 .. 运算符。

AWK

自从使用 AWK 以来已经足够长了(必须 > 18 年,因为后来我只使用了 Perl),所以不能真正评论。

sed

[看上面]

文件(提供文件信息的命令)

PowerShell 在这里的优势与其说是它可以对文件系统对象做什么(并且它在此处获取完整信息,dir 会根据需要返回 FileInfoFolderInfo 对象),而是它是整个提供程序模型。

您可以将注册表、证书存储、SQL Server、Internet Explorer 的 RSS 缓存等视为可由与文件系统相同的 cmdlet 导航的对象空间。

PowerShell 绝对是 Windows 上的前进方向。微软已将其作为未来非家用产品要求的一部分。因此在 Exchange 中的丰富支持,在 SQL Server 中的支持。这只会扩大。

最近的一个例子是 TFS PowerToys。许多 TFS 客户端操作无需每次都启动 tf.exe(这需要新的 TFS 服务器连接等)即可完成,并且随后进一步处理数据更加容易。以及允许对整个 TFS 客户端 API 的广泛访问比在 TF.exe 的任何一个团队资源管理器中公开的更详细。


问题是提供者模型很有趣,只是因为操作系统不使用文本作为其通用配置介质,所以你需要这些提供者。对于 UNIX,大多数语言都有 API 来处理 PAM、主机和包,但最终文本将始终存在。
文本并不总是最好的格式(从数据库和光栅图像开始)。但我认为我们可以同意不同意而不是开放格式战争。
Powershell 可以使用 .NET 框架中的任何对象,这不符合 Perl 的域功能吗?另外,如果您想要可重用性,您可以在 C# 等中编写 cmdlet
逐点比较。好东西。这应该是公认的答案。 PowerShell 的优势在于它的 .NET 基础以及通过编写新的 Cmdlet 甚至调用类库来扩展系统是多么容易
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{};}
P
Peter Mortensen

作为一个从 1997 年到 2010 年专注于 Windows 企业开发的人,显然的答案是 PowerShell,因为之前给出的所有充分理由(例如,它是 Microsoft 企业战略的一部分;它与 Windows/COM/.NET 很好地集成;以及使用对象而不是文件提供了“更丰富”的编码模型)。出于这个原因,在过去两年左右的时间里,我一直在使用和推广 PowerShell,并明确相信我在遵循“比尔的话”。

但是,作为一个实用主义者,我不再确定 PowerShell 是一个很好的答案。虽然它是一款出色的 Windows 工具,并且为填补 Window 命令行这一历史漏洞提供了非常必要的一步,但当我们都看到微软在消费者计算领域的控制下滑时,微软似乎越来越有可能在未来进行一场大规模的战斗,以保持其操作系统为对未来的企业很重要。

事实上,鉴于我发现我的工作越来越多地在异构环境中工作,我发现目前使用 Bash 脚本更有用,因为它们不仅适用于 Linux、Solaris 和 Mac OS X,而且还适用于Cygwin 的帮助——在 Windows 上。

因此,如果您相信操作系统的未来是商品化而不是垄断,那么在可行的情况下选择远离专有工具的敏捷开发工具策略似乎是有意义的。但是,如果您看到自己的未来被所有的 Redmond 所主宰,那么请选择 PowerShell。


unix 脚本是否可以在 Cygwin-Windows 上完美运行而没有错误?
@Pacerier 我使用 Cygwin 和 MinGW 已经 12 年了,出乎意料地很少遇到问题。重要的是,如果某些东西不起作用,总是可以求助于 Windows 工具或任何东西——进程的启动方式与任何其他 shell 启动它们的方式相同。
好的,你的答案是从 2011 年开始的。今天 powershell 也可以在 linux 上运行。而且——我个人的看法——bash 太古老了。语法很糟糕,我宁愿使用不同的脚本语言。如今,python 在大多数 linux 发行版上都是标准配置,我认为没有任何理由使用 bash 编写脚本。我建议您再次检查 powershell,因为自 2011 年以来发生了很多事情。
P
Peter Mortensen

我使用了一些 PowerShell 来实现脚本自动化。虽然环境似乎比 Unix shell 考虑得更多,但实际上使用对象而不是文本流要笨拙得多,而且在过去 30 年开发的许多 Unix 工具年仍然失踪。

Cygwin 仍然是我为 Windows 主机选择的脚本环境。在完成工作方面,它肯定优于其他选择。


使用对象是一种范式转变,需要一些时间来适应。但是避免了在涉及结构化数据的每个步骤中的整个重新解析(例如,不需要确保字段被分隔)。
@Andy White @Daishiman,我可以理解 PowerShell 的学习曲线在哪里,但是管道对象可以比管道文本灵活得多。 @Richard 是正确的。 :)
汽车制造商也很难与 1000 多年的马匹争论。我不想轻率。只是指出过去的成功并不能消除创新的潜在好处。
@daishiman - 对象的好处是,当你想要一个属性时,你要求它 - 你不必解析、猜测、转换。我不明白你关于“当对象没有兼容的方法时会发生什么”的观点 - 你能换一种说法或举一个问题的例子吗?谢谢。
@Daishiman - 我明白了。在实践中,人们发现这不是一个问题,而是一个巨大的优势。也就是说,我可以看到,如果您是专家级的文本解析器,这将是一项需要学习的新技能,一开始可能会觉得没有必要而且很尴尬。再一次 - 任何有帮助的都是正确的工具。
P
Peter Mortensen

这里有很多很棒的答案,这是我的看法。如果你准备好了,PowerShell 已经准备好了......示例:

grep = "Select-String -Pattern"

排序 = "Sort-Object"

uniq = "Get-Unique"

文件 =“Get-Item

猫 =“Get-Content

Perl/AWK/Sed 不是命令,而是实用程序,因此很难比较,但您几乎可以在 PowerShell 中完成所有操作。


你能相信我们的祖先被迫使用的神秘的四字母命令吗?
@EvgeniSergeev 默认情况下,上述所有内容分别为 slssortgugigc。在一个系统中使用制表符完成的长可读名称和可键入的短名称。这对您来说是用户友好的进步。
Get-Content 的别名之一是 cat,因此 Cygwin/Unix 和 PowerShell 之间没有任何区别。不幸的是,在大多数情况下,Microsoft 的 cmdlet 文档都缺少有关别名的信息,但在 PowerShell 会话中却缺少 a list of all aliases is output by using Get-Alias。 “Get-Unique”的别名是“gu”,所以它比 Cygwin/Unix 短!
P
Peter Mortensen

我最近才开始认真地涉足 PowerShell。尽管在过去的七年里,我一直在几乎完全基于 Windows 的环境中工作,但我来自 Unix 背景,发现自己一直在尝试“Unix-fy”我在 Windows 上的交互体验。至少可以说令人沮丧。

将 PowerShell 与 Bashtcshzsh 之类的东西进行比较是公平的,因为像 grepsedawk 这样的实用程序, find 等严格来说不是shell的一部分;但是,它们将始终是任何 Unix 环境的一部分。也就是说,像 Select-String 这样的 PowerShell 命令具有与 grep 非常相似的功能,并且 is 被捆绑为 PowerShell 中的核心模块......所以行可能有点模糊。

我认为关键是文化,以及各自的工具集将体现各自的文化这一事实:

Unix 是基于文件的(通常是非 Unicode)基于文本的文化。配置文件几乎完全是文本文件。另一方面,Windows 在配置格式方面总是更加结构化——配置通常保存在专有数据库(例如,Windows 注册表)中,这些数据库需要专门的工具进行管理。

Unix 管理(以及多年来的开发)界面传统上是命令行和虚拟终端。 Windows 最初是作为 GUI 的,而管理功能最近才开始从完全基于 GUI 的转变。鉴于它在 PowerShell 上的显着领先优势,我们可以期待 Unix 在命令行上的体验会更丰富、更成熟,而我的经验与此相符。关于这一点,根据我的经验: Unix 管理经验旨在使事情变得容易,只需最少的按键;这可能是由于必须通过缓慢的 9600 波特拨号连接来管理服务器的历史情况。现在 PowerShell 确实有别名,这对绕过相当冗长的动词名词标准有很大帮助,但是了解这些别名有点痛苦(任何人都知道比:别名 | where {$_.ResolvedCommandName - eq ""}?)。可以操作历史的丰富方式的一个示例:iptables 命令通常是冗长的,如果不是因为 Bash 中内置的许多巧妙的历史操作功能之一,iptables 命令通常是冗长的,并且重复它们略有不同会很痛苦,所以插入如下 iptables 规则: iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT a second time for another camera ("camera-2"), is just a case of发出: !!:s/-1-/-2-/:s/50/51 表示“执行前面的命令,但将 -1- 替换为 -2- 并将 50 替换为 51。Unix 体验针对触摸进行了优化-打字员;一个人几乎可以在不离开“家”位置的情况下做任何事情。例如,在 Bash 中,使用 Emacs 键绑定(是的,Bash 还支持 vi 绑定),循环历史记录是使用 Ctrl-P 和 Ctrl 完成的-N 同时移动到一行的开头和结尾分别使用 Ctrl-A 和 Ctrl-E 完成......而且它绝对不会在那里结束。尝试即使是最简单的 navigati在 PowerShell 控制台中打开而不从主位置移动,你就有麻烦了。像 Unix 上的通用分页(少一点)这样简单的东西在 PowerShell 中似乎没有开箱即用,这有点令人沮丧,而且也不存在丰富的编辑器体验。当然,人们总是可以下载能够填补这些空白的第三方工具,但如果这些东西就像在几乎任何风格的 Unix 上一样“存在”,那就太好了。

Unix 管理体验旨在以最少的击键使事情变得容易;这可能是由于必须通过缓慢的 9600 波特拨号连接来管理服务器的历史情况。现在 PowerShell 确实有别名,这对绕过相当冗长的动词名词标准有很大帮助,但是了解这些别名有点痛苦(任何人都知道比:别名 | where {$_.ResolvedCommandName - eq ""}?)。可以操作历史的丰富方式的一个示例:iptables 命令通常是冗长的,如果不是因为 Bash 中内置的许多巧妙的历史操作功能之一,iptables 命令通常是冗长的,并且重复它们略有不同会很痛苦,所以插入如下 iptables 规则: iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT a second time for another camera ("camera-2"), is just a case of发出: !!: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,它们都是高度结构化和基于对象的。另一方面,对 Unix API 的访问传统上是通过文件接口(/dev 和 /proc)或(非面向对象的)C 风格的库调用。脚本编写体验与它们各自的操作系统范例相匹配也就不足为奇了。 PowerShell 本质上是结构化的(一切都是对象)并且基于 Bash-and-friends 文件。 PowerShell 程序员可以使用的结构化 API 非常庞大(基本上与现有的标准 COM 和 .NET 接口集的庞大相匹配)。

简而言之,尽管 PowerShell 的脚本功能可以说比 Bash 更强大(尤其是考虑到 .NET BCL 的可用性时),但 交互式 体验非常重要较弱,特别是如果您是从完全由键盘驱动、基于控制台的角度来看它(就像许多 Unix-heads 一样)。


你问“任何人都知道比:别名 | where {$_.ResolvedCommandName -eq "<command>"}?”。仅 alias -Definition *property (或任何其他模式)怎么样?我认为您的答案的问题在于您将 shell 和控制台混为一谈:请记住,您可以选择具有不同编辑选项的控制台。他们故意破坏 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 shell 中闻所未闻的事情;如果您想知道一个命令运行了多长时间:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
@Duncan关于你对shell和控制台的评论——我认为这只是Bash和PS之间的根本区别;也就是说:Bash 期望提供某种交互体验,而 PS 将其“留给”其他东西。我对 ISE 控制台没有太多经验,但据我所知,它也没有非常丰富的交互体验。
@Duncan,是的-关于 PS 在巧妙的历史技巧方面提供的能力的好点。
@Duncan ...但是尽管您断言某些事情在 Linux shell 中是闻所未闻的:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
P
Peter Mortensen

无论如何,我不是一个非常有经验的 PowerShell 用户,但我接触到的一点点给我留下了深刻的印象。您可以将内置 cmdlet 链接在一起,以执行您可以在 Unix 提示符下执行的任何操作,并且还有一些额外的好处可以执行诸如导出到 CSV、HTML 表以及更深入的系统管理类型的工作.

如果您真的需要像 sed 这样的东西,那么总会有 UnixUtilsGnuWin32,您可以很容易地与 PowerShell 集成。

作为一个长期使用 Unix 的用户,我在习惯命令命名方案方面确实有点困难,如果我了解更多 .NET,我肯定会从中受益更多。

所以本质上,我说如果它的仅限 Windows 不会造成问题,那么它是非常值得学习的。


有一个开源项目“Pash”可让您通过 Mono 在其他平台上运行 PowerShell。 tinyurl.com/6dyoso
哇!谢谢你的提示;我迫不及待想试一试
P
Peter Mortensen

如果你喜欢 shell 脚本,你会喜欢 PowerShell!

A guided tour of the Microsoft Command Shell (Ars Technica) 开始。


我喜欢 shell 脚本,我容忍 PowerShell。它的命令和语法很糟糕。非常长的命令和选项,没有任何有用的命令完成。或者如果有我还没有找到。太多的功能塞进了应该分开的单个命令中。只有 DOS 批处理程序员才会喜欢的奇怪的变量和转义语法。
@Zan Lynx - 你没有找到东西是对的。所有命令都有别名,其中许多都匹配 DOS 和 UNIX 命令(ps、dir、rm、ls、kill、history、man、cat、clear 等)。名称很长,因此它们具有有意义的名称。非常适合脚本 - 当新人必须使用和维护它时,它会有所帮助。 cmdlet、函数、变量、路径、参数等有选项卡扩展。大部分语法来自 Unix shell,你在说什么转义语法? `` 不用于转义,因为它是 Windows 中的路径分隔符。
@Zan Lynx - 你的论点无效。要停止解释变量,请使用 '(单引号)。对于双双引号的东西 - 同样,使用 write-output 'this is a "test"'。您指向的问题是针对正则表达式的,而正则表达式的转义在任何地方都有效。 Powershell 也有 Here-Strings / 逐字字符串。甚至 Java 也没有这些!尝试在 Java 中转义正则表达式。而且您有时不使用文字路径。您需要时使用。 LiteralPath 逐字处理通配符而不扩展它们。当您的文件有它时,您可以使用它。它为您提供了更多选择。
@manojlds:与 bash shell 相比,Powershell 充满了毫无意义且令人困惑的不一致之处。在 bash 中,您在任何地方都使用相同的转义字符,并且文件路径会像字符串一样被转义。你不需要一个特殊的参数。如果你扩展一个包含特殊字符的变量,你把它放在双引号中,内容是安全的,不需要调用函数来重新转义它。
@Zan Lynx - 没有不一致的地方。甚至 write-output "this is a `"test`"" 也有效。只需使用 ` 而不是 `\`。 regex::escape 的存在是为了帮助你,这样你就不会错过转义的东西。没有必要使用它。您认为可以帮助您和防止错误的其他选项是不一致的。
P
Peter Mortensen

由于我最近的实验使我深入了解了 PowerShell 和 .NET 调用,我必须说 PowerShell 可以替代 Cygwin 和 Unix shell。

我不确定 Perl,但由于 PowerShell 和 Perl 作为编程语言都是图灵完备的,所以我也同意替换 Perl。

PowerShell 在 Cygwin 和 *nix 下的普通 Bash 之上的一件事是,它能够执行沙盒 DLL 调用,通过直接 API 调用、WMI 方法甚至 COM 对象来操纵操作系统。如何通过代码启动 Internet Explorer,然后对其显示的文档做任何您想做的事情,有效地模拟 Web 服务器的后端?

如何从 SQL 服务器和其他数据提供者收集数据,解析它们并导出为 CSV、邮件消息、文本以及任何类型的现有和不存在的文件格式? (当然,具有根据收到的数据创建有效文件的适当技能,但 CSV 很容易获得)。

通过签名的 cmdlet 和脚本、组策略和执行策略可以提供额外的安全性,即使您以管理员身份运行恶意代码,它们也有助于防止恶意代码在您的系统上运行。

关于实现了哪些命令 - Richard 的答案列出了它们以及 PowerShell 已经模拟它们的功能的能力。

关于 PowerShell 是否强大以保证切换 - 这更多是个人喜好问题,尽管随着越来越多的 Windows 服务提供 PowerShell cmdlet 来控制它们,不使用带有这些服务的 PowerShell 被认为是一个障碍。 (Hyper-V 服务器是主要的此类服务,它还提供了使用 PowerShell cmdlet 比使用 GUI 执行更多操作的能力!)

这个答案可能晚了五年,但是,如果有人在 Windows 上执行管理任务或各种东西的一般脚本,他们绝对应该尝试利用 PowerShell 来达到他们的目的。


P
Peter Mortensen

当您将 PowerShell 与 Cygwin/Perl/Shell 组合进行比较时,请注意 PowerShell 仅代表该组合的“Shell”部分。

但是,您可以从 PowerShell 调用任何命令,就像从 cmd.exe 或 Cygwin 一样。它没有重新实现指定的功能,当然也比不上 Perl。

它“只是”一个外壳,但它使编程更容易,为 .NET 世界提供了一个舒适的接口。

另请记住,PowerShell 需要 Windows XP、Windows Server 2003 或更高版本,这可能会根据您的 IT 基础架构造成问题。

更新:

我不知道我的回答会引发什么样的哲学辩论。

我在问题的上下文中发布了我的答案:将 PowerShell 与 Cygwin 和 Perl 和 Bash 进行比较。

PowerShell 是一个 shell,因为它在内置命令、命令行开关、用户函数和外部命令(.exe、.bat、.cmd)之间没有语法差异。只有调用 .NET 方法的不同之处在于在调用中添加命名空间或对象。

它的可编程性源自 .NET 框架,而不是任何特定于 PowerShell“语言”的东西。

我想说我相信 PowerShell 是一种“脚本语言”,只要将 BugzillaMediaWiki 实现为在 Web 服务器上运行的 PowerShell 脚本;)

在那之前,享受 comparisons


是的,我想当我谈论 Unix“shell”时,我也指的是 Unix 附带的所有普通实用程序,例如 grep、awk 等。我只是想知道 PowerShell 是否提供类似的实用程序-盒子。
Powershell 不是“只是一个外壳”。它是一种脚本语言。我想知道它在哪些方面无法与perl相媲美?我承认它没有那么成熟,但除此之外我看不到差异。
@EBGreen,您对此评论的确切含义是什么?我同意任何 shell 或脚本语言本质上都是相似的,但我想知道更多关于 PowerShell 与 bash/perl/其他 unix shell/脚本语言的具体功能。
Powershell 具有非常广泛的功能。它是 - 一种交互式、可组合的 shell - 一种丰富的交互式脚本语言 - 一种编程语言 它还具有一组丰富的 OO 和 tesxt 实用功能(即等效于 grep/awk/etc)。
@Andy - 我理解 Devio 说 powershell 不如 Perl 强大。我不相信这是真的,我只是想知道他为什么会这么认为。
3
3 revs, 2 users 72%

TL;DR -- 我不讨厌 Windows 或 PowerShell。我无法在 Windows 或 PowerShell 中做任何事情。

我个人仍然觉得 PowerShell 充其量是平淡无奇的。

目录路径的制表符完成不复合,要求用户在每个名称完成后输入路径分隔符。

我仍然觉得 Windows 甚至没有路径或路径是什么的概念,没有可访问的用户主页指示器 ~/ 缺少一些 @environment://somejibberish/%user_home%

NTFS 仍然是一团糟,而且似乎永远都是。祝您导航顺利。

cmd-esque界面,恐龙cmd.exe在PowerShell中仍然可见,编辑→标记仍然是复制信息的唯一方式,并且仅以可见终端空间的矩形块的形式进行复制。和 Edit → Mark 仍然是将字符串粘贴到终端的唯一方法。

将其涂成蓝色并不会使其更具吸引力。不过,我不介意微软开发人员对颜色有兴趣。

Windows 总是在屏幕的左上角打开。对于使用垂直任务栏的人来说,这非常烦人,特别是考虑到 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 push 这样的东西在 Mintty 中被破坏了。

我并不是要咆哮,但即使使用像 Cygwin 这样的工具,我仍然看到 Windows 上的命令行可用性存在巨大问题。

PS:仅仅因为可以在 PowerShell 中完成某些事情,并不能使其可用。可用性比能力更深层次,是我作为消费者尝试使用产品时倾向于关注的内容。


开启快速编辑模式?选择并按回车键复制,ctrl-v粘贴,不再编辑->标记或编辑->粘贴。在首选项中,设置窗口位置并取消勾选“让系统定位窗口”。制表符补全不只是补全文件系统路径,它还补全变量名、命令名、对象属性,您可能要键入 .[ 来访问属性或索引,所以它不能只添加路径末尾的分隔符。究竟是哪个 PowerShell wget?哪个 PowerShell POSIX?它不是试图将 gnu 工具带到 Windows,或者是与 bash 兼容的顺便说一句。
是的,我知道这不是要成为 bash。我在原帖中没有这么说。我会说 which w 得到二进制文件,但 power shell 中没有“which”命令 :( 我不记得在哪里买我读过 power Shell 应该是 POSIX 兼容的
回复:“没有哪个”-> (get-command wg*.exe).Path。回复:bash 完成和 readline -> leeholmes.com/blog/2012/09/13/… 导致 github.com/lzybkr/PSReadLine
P
Peter Mortensen

PowerShell 中的 cmdlet 非常好用并且工作可靠。因为我是一名 Java/C# 开发人员,所以它们的面向对象特性对我很有吸引力,但它根本不是一个完整的集合。由于它是面向对象的,因此错过了 POSIX 工具集的许多成熟的 text streamawksed 仅举几例)。

对于热爱 OO 技术和热爱 POSIX 工具的成熟度这两个困境,我发现的最佳答案是两者都使用! PowerShell 的一个重要方面是它出色地将对象管道传输到标准流。默认情况下,PowerShell 使用对象管道来传输其对象。这些不是标准流(标准输出、标准错误和标准输入)。当 PowerShell 需要将输出传递给没有对象管道的标准进程时,它首先将对象转换为文本流。由于它在这方面做得很好,因此 PowerShell 是托管 POSIX 工具的绝佳场所!

最好的 POSIX 工具集是 GnuWin32。安装确实需要超过 5 秒,但值得麻烦,据我所知,它不会修改您的系统(注册表、c:\windows\* 文件夹等),除了将文件复制到您指定的目录.这特别好,因为如果您将工具放在共享目录中,许多人可以同时访问它们。

GnuWin32 安装说明

下载并执行 exe(它来自 SourceForge site),将其指向合适的目录(我将使用 C:\bin)。它将在那里创建一个 GetGnuWin32 目录,您将在其中运行 download.bat,然后是 install.bat(不带参数),之后,将有一个 C:\bin\GetGnuWin32\gnuwin32\bin 目录,它是曾经存在于视窗机。将该目录添加到您的路径中,您就可以开始了。


P
Peter Mortensen

我还没有看到 PowerShell 真正起飞,至少现在还没有。因此,除非您团队中的其他人已经知道它,否则可能不值得努力学习它。

对于您的困境,您可能最好使用其他人可能落后的脚本语言,如您提到的 Perl,或其他如 Ruby 或 Python。

我认为这在很大程度上取决于您需要做什么。就我个人而言,我一直在将 Python 用于我自己的个人脚本,但我知道当我开始编写一些我永远无法传递的东西时——所以我尽量不做任何太具有革命性的事情。


P
Peter Mortensen

为什么不两者都用?在 Cygwin 中调用 PowerShell 脚本,就像 Perl 等任何其他解释脚本一样。

我这样做已经足够我为 Bash 包装器编写 https://bitbucket.org/jbianchi/powershell 以在 Cygwin 中调用 powershell.exe。它可以用作 shebang 作为 powershell.exe .ps1 脚本的第一行(因为 PowerShell 也使用“#”作为注释)。有关示例,请参见 https://bitbucket.org/jbianchi/powershell/wiki/Home


P
Peter Mortensen

在几行中,Cygwin 和 PowerShell 是不同的工具,但是如果您安装了 Cygwin,则可以在 PowerShell 会话中运行 Cygwin 可执行文件。我已经习惯了 PowerShell,以至于现在我不再使用 grep、sort、awk 等。PowerShell 中有很多内置的替代品,如果没有,你可以在那里找到一个 cmdlet。

我发现自己使用的主要工具是 ssh.exe,但在 PowerShell 会话中。

它工作得很好。


R
Rob Kielty

我发现 PowerShell 编程不值得付出努力。

我有几年在 Unix 下编写 shell 脚本的经验,但我发现用 PowerShell 做很多事情都非常困难。

似乎许多功能都需要您询问 Windows 管理界面并发出类似 SQL 的命令来获取您需要的信息。

例如,我想编写一个脚本来从目录树中删除所有具有特定后缀的文件。在 Unix 下,这将是一个简单的...

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

几个小时后,使用 Scripting.FileSystemObjectWScript.Shell 并发出 "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" &驾驶与"' AND 路径 = '" &搜索文件夹和"'",我终于放弃了,选择了 Windows Explorer 的 Search 命令,只需要手动操作即可。可能有一些方法可以做我想做的事,但我没有看到任何明显的东西,而且 MSDN 网站上的所有示例都如此微不足道,毫无价值。

编辑 嘿,当然,当我写完这篇文章后,我又浏览了一些内容,发现了我遗漏的内容:remove-item 命令的 -recurse 选项有问题(如果您使用 { 2})。

我一直在尝试“remove-item -filter '* .xyz' -recurse”,但它不起作用,所以我放弃了。

原来你需要使用 get-childitem -filter '*.xyz' -recurse | remove-item


我认为您将 Windows Scripting Host (WSH) 与 PowerShell 混淆了。他们完全不同。
例如,如果你想删除所有以 .TMN 结尾的文件,你可以发出这个命令 get-childitem c:\ -include *.TMN -recurse | foreach ($_) {删除项目 $_.fullname}
@Mystere:我试过这个,但它似乎没有用。经过一番折腾,看来 *.tmn 是您所需要的(而不仅仅是 .tmn)
我不能恭敬地不同意更多,而且我绝不是 Windows 人。我发现 PS 比 bash 更容易编写脚本。 PS比较一致。使用 Bash,您调用的任何控制台实用程序都有自己的语法和独特的行为,而 bash 语法本身相当神秘。 PS 在匿名函数、(脚本块)、参数验证、高级函数等语言特性方面更加健壮。加上可移植性和许多其他特性的模块概念。主要是,最大的原因是你总是听到关于 PS 的事情,对象胜过文字。 Bash 仍然更快。
P
Peter Mortensen

您还可以尝试使用 https://github.com/skanga/BashWin 处的 BashWin 在 Windows 上运行 Bash 脚本。


P
Peter Mortensen

PowerShell 非常强大,比 Unix shell 的标准内置程序更强大(但这只是因为它包含了通常由子程序提供的大部分功能)。此外,考虑到您可以使用任何 .NET 语言编写小程序,包括 IronPythonIronRuby、PerlNet 等。或者您可以简单地从 PowerShell 调用 Cygwin 命令,忽略所有额外功能,它的工作方式类似于重击、KornShell 或其他...


我认为您可能错过了 Unix shell 的设计目标。不敲 PowerShell(想自己了解更多),但您需要了解 Unix 工具才能做出这样的声明。
@Xepoch - 不,我认为你错过了 PowerShell 的设计目标。 PowerShell 可以执行 Unix shell 可以执行的所有操作,方式与它们相同。但是,当您使用 PS 的对象管道系统而不仅仅是解析文本输出时,真正的威力就来了。因此,PowerShell 完全可以做 bash 或 korn 可以做的事情,但它们不能做 PowerShell 可以做的事情。
我对 PowerShell 的了解不足以对您进行批评,但正如您清楚地知道,Unix shell 的目标不一定是完全全面地替代外部工具,而是围绕它的控制结构。同样,我现在无法比较或对比,但提升 PowerShell 因为它有更多的内置功能并不一定是 Unix shell 的好处。
@Xepoch - 关键是,你可以选择你想要的方式。您可以使用内置 shell 的所有优点,也可以忽略并按照 Unix 的方式进行操作。这是你的选择。选择是好的,对吧?