这个PowerShell代码有什么作用?

时间:2018-04-09 08:27:26

标签: powershell

我在一本关于PowerShell脚本的书中找到了以下代码:

$Text = Read-Host -Prompt 'Input your text'

function FastTrain($text) {
    $h = @{}

    ForEach ($word in [regex]::split($text.ToLower(), '\W+'))
    {
        $h[$word] = ''
    }

    $h
}

FastTrain($Text)

我试图运行它,并得到了这个:enter image description here

它做什么?我认为它从用户获取一个字符串,然后搜索字符,但我不完全确定。

2 个答案:

答案 0 :(得分:2)

  1. 阅读用户的一行文字

    $Text = Read-Host -Prompt 'Input your text'
    
  2. 定义一个函数

    function FastTrain($text) {
    
    • 创建新的哈希表。这是一个将键映射到值的数据结构。

      $h = @{}
      
    • 小写text参数并将其拆分为连续的非单词字符。这导致了一个“单词”数组(但是,因为正则表达式的“单词”字符是一个非常随意的概念,在任何地方都很少使用,这也包括数字,下划线和除字母之外的一堆其他东西)。 / p>

      ForEach ($word in [regex]::split($text.ToLower(), '\W+'))
      {
      
    • 在哈希表中使用单词as key并将值设置为空字符串。这只是一个穷人的集合版本,因此散列表将包含来自输​​入的所有唯一单词作为键(值无关紧要)。

         $h[$word] = ''
      }
      
    • 返回哈希表

          $h
      }
      
  3. 在之前读取的输入上运行上面的函数。这也会导致之前的哈希表被打印在屏幕上,因为默认情况下会输出从语句或管道返回的任何对象。

    FastTrain($Text)
    

    请注意,PowerShell功能的这种用法在技术上是不正确的,很容易导致错误。 PowerShell函数与任何其他PowerShell命令一样被调用,但不是,就像.NET方法一样。所以参数用空格分隔,没有括号。在这种情况下,它起作用,因为只有一个参数。

  4. 鉴于这个例子是多么残暴,我猜你应该找一本更好的书。这段代码看起来与PowerShell代码应该的外观完全不同(至少在我看来)。该代码执行的功能基本上是“给定一个字符串,从中返回所有唯一的单词”。该函数的更多PowerShell-ey版本可能是:

    function Get-UniqueWords($Text) {
      $Text.ToLower() -split '\W+' | Select -Unique
    }
    

    不要乱用哈希表,只是为了得到一组排序。没有不必要的调用PowerShell运算符就足够的.NET方法。并使用管道来转换和/或过滤数据流。这样的循环通常是不必要的,因为管道通常更容易阅读和掌握(因为你可以只读取事物如何通过管道传输到另一个,而不必解析数据结构发生的事情,以找出数据发生了什么)。 / p>

    然而,考虑到我之前对\w / \W的抱怨,以下正则表达式可能会为人类带来更好的结果:

    function Get-UniqueWords($Text) {
      $Text.ToLower() -split '\P{L}+' | Select -Unique
    }
    

    这真的只考虑字母。

答案 1 :(得分:0)

正在阅读用户的一句话:

$Text = Read-Host -Prompt 'Input your text'

然后创建一个空的哈希表(一组键值对):

$h = @{}

然后,将句子分成单词:

[regex]::split($text.ToLower(), '\W+'))

并将每一个添加到哈希表中(将单词作为键,而不是值的任何内容):

$h[$word] = ''

最后,它打印哈希表:

$h

混合了函数定义/调用,但上面是代码所做的。