【问题标题】:Are there good references for moving from Perl to Powershell?从 Perl 迁移到 Powershell 是否有很好的参考资料?
【发布时间】:2010-11-22 20:16:00
【问题描述】:

我不想这么说,但是 powershell 真的很烦我。我似乎无法理解它。我有一本关于这个主题的 O'Reilly 书,我可以看到如何做一些非常强大的事情——这是我似乎无法正确完成的简单事情。

恰当的例子:遍历文件名列表。

在 CMD 中:

for /F %x in ('dir EXPRESSION') do @(
   arbitrary-action %x
)

在 Perl 中:

@foo=glob("*");
foreach (@foo)
{
   arbitrary-command $_ ;
}

在 Powershell 中:

I'm dumbfounded.  I can't seem to get it right.

但我不会发送此帖子,因此有人可以告诉我答案。我不想回答这个简单的问题。我想知道如何弄清楚,而 Google/Bing 搜索并没有削减它。 get-help 功能是 powershell 不错,但还是不够。

我已经编程了 20 年。 我学习了 BASIC、Fortran、C、Pascal、Perl、C++、C#、BASH 和 CMD 脚本……而且我从来没有遇到过 Powershell 遇到的麻烦。

是否没有关于从 Perl 迁移到 Powershell 的“外部”参考?发布似乎是一件很简单的事情,但我还没有找到。

任何帮助将不胜感激。谢谢。

更新:

好的,所以也许这不是发布的最佳示例。

我认为当我以交互方式尝试 gci 时,我得到了一个目录列表,我想要的是一个字符串数组。

我信誓旦旦地尝试了:
foreach ($foo in gci "*") { 回声 $foo; }

是的,它奏效了。是的,我可以继续进行搜索以解决问题。我想我只是希望找到一个利用与我已经知道的语言相似性的指南。我知道 Microsoft 发布了 VBScript-to-Powershell 指南,所以我希望有一个 Perl 等价物。


再次感谢

【问题讨论】:

  • 谷歌的标准方法是什么?你学会一次做一件事?例如,我在单个查询中找到了解决方案。我希望您有一本书,所有这些都可以阐明您在 Google 上找到的解决方案。
  • 顺便说一句,查询的条件是 powershell+iterate+over+a+list+of+filenames
  • 在各大搜索引擎上很难找到 Perl 到 Powershell 的指南。回答在 Google 上很容易找到的问题并没有错。通过询问他们并让他们在这里得到回答,他们将来可能会更容易找到。
  • 即使以 C 作为参考点,在 Perl 变得危险/有效/有用到足以成为自对新手有益的锻炼。 PowerShell 也是如此——即使以 .Net 作为参考。

标签: perl powershell


【解决方案1】:

我从未见过这样的指南。我看到了一些可以帮助人们从 VBScript 转向 PowerShell 的东西。

Bruce Payette 的 PowerShell in Action 确实有几页介绍 PowerShell 与 X 脚本语言,但这并不能作为转换指南。

现在,有一个网站有多种语言的各种结构,因此提供了一个任务,然后根据社区的答案用各种语言解决它......任何人都知道我是在说什么?

【讨论】:

【解决方案2】:

我不知道 Perl 与 Powershell 有什么好的比较,但我可以回答您的第二个问题。

$files = get-childitem "c:\test\" -filter *.dll
foreach ($file in $files) { $file.Name } 

您可以通过两种不同的方式在 Powershell 中表达foreach 循环。

您可以将一组对象通过管道传递到foreach$_ 成为每次迭代的当前对象。

0,1,2,3 | foreach { $_ }

或者,您可以传递一个变量进行迭代。

foreach ($num in 0,1,2,3) { $num } 

两种情况下的输出。

0
1
2
3

【讨论】:

  • 有人想解释一下-1吗?
  • 不是我,但我认为这是由于 OP 说“我不想要这个简单问题的答案。我想知道如何弄清楚。”
  • 那是真的,我的回答和其他人一样(但确实回答了简单的问题)而且有人投了反对票……但你有一个有效的观点,我应该读过更彻底地提问。
【解决方案3】:

就像他自己说的那样,他意识到使用 powershell 获得一些非常强大的东西的潜力......我最近开始自己使用它,并且可以轻松地完成事情是令人震惊的......只需几行就可以了需要完成在 python 中需要我一些额外的解决方法等的事情。

【讨论】:

    【解决方案4】:

    我很好奇你有 powershell 食谱吗?我认为由于我有编程经验,这将是快速学习 powershell 的最佳方式。结果证明这是一个糟糕的假设。尽管这本书真的很好,我还是很挣扎,因为我需要一本结构更适合学习而不是参考的书。

    我发现的两本最好的免费在线电子书是:

    https://blogs.technet.com/chitpro-de/archive/2007/05/10/english-version-of-windows-powershell-course-book-available-for-download.aspx

    http://powershell.com/cs/blogs/ebook/

    我还在寻找一本好的印刷书。

    【讨论】:

      【解决方案5】:

      我认为找到 Perl 到 PowerShell 的指南会很困难。实际上,将 PowerShell 与 BAsh 和 C Shell 进行比较比 Perl 更准确。我认为从大多数可用书籍中学习 PowerShell 的困难在于它们针对的是系统管理员,而不是程序员。我推荐“PowerShell in Action”,以最大限度地了解 PowerShell 作为通用编程语言。

      您需要做的另一件事是立即接受 PowerShell 的核心原则——您处理的是对象,而不是文本。使用 BAsh 和其他 Unix shell,它都是关于文本操作的,虽然 Perl 可以处理对象,但它的根源仍然是 Unix shell 和命令行实用程序(grep、sed、awk 等)。

      Larry Wall 在创建 Perl 时从其他语言中借鉴了许多伟大的想法。 PowerShell 也做了同样的事情,使用 POSIX shell 作为其起点。您可以在 PowerShell 以及其他语言中看到很多 Perl。我认为学习 PowerShell 的最佳方法是在阅读“PowerShell in Action”时在您面前打开一个 PowerShell 窗口,这将帮助您进入 PowerShell 思考它如何处理对象的方式。在 PowerShell 窗口中以交互方式输入代码 sn-ps 并检查命令返回的对象中可用的属性和方法很容易。

      顺便说一句——如果你习惯于使用带有 default 命令行编辑功能的 BAsh,请将以下命令放入你的 PowerShell $PROFILE

      Set-PSReadlineOption -editmode Emacs

      这样做,您就会有宾至如归的感觉。现在我可以在 Linux 和 Mac 上运行 PowerShell,我不确定我是否需要再次使用 BAsh。

      【讨论】:

        【解决方案6】:

        有趣...当我开始使用 PowerShell 时,我也遇到了同样的问题,但是在使用 PowerShell 几个月后,我在舞会之后像丑陋的 Sally 一样抛弃了 Perl。有几种使用 foreach 循环对象列表的好方法。让我们看看下面的示例,其中我想确保在我的 Windows Server 上运行许多服务(这些进程的名称中都包含 Equal)。我可以用一个单行命令来做到这一点,如下所示:

        Get-Service | where-object {$_.displayname -like "Equal*"} | foreach {
          if($_.Status -eq "Stopped") {
            Write-Host "`nRestarting..."
            write-host $_.DisplayName 
            Start-Service $_.name
          } 
        }
        

        命令的第一部分是 get-service 命令 - 过滤服务以查找显示名称中包含 Equal 的服务。一个班轮的下一部分真正展示了 PowerShell 的美丽。 get-service 命令返回一个对象列表,然后可以通过将它们传送到 foreach 循环中来对其进行操作。注意我不必声明任何变量或数组来保存对象。对象存储在默认的 $_ 变量中,我可以从中提取对象属性,例如名称和状态。 Foreach 返回的对象(服务)我检查它的状态以查看它的状态是否已停止,如果是,则使用 Start-Service 命令重新启动。我可以使用 Perl 执行类似的操作,但我必须筛选抓取并将值放入数组中,然后以与上面类似的方式遍历数组。屏幕报废将涉及 grep 和正则表达式,这会添加代码行。因为 PowerShell 命令会生成具有属性的对象,所以我可以快速深入到我正在寻找的属性,而无需担心屏幕抓取问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多