在 powershell 中转换数组的一部分

Converting Parts of an Array in powershell

我应该将此标记为家庭作业,但我不确定如何标记。不要求答案,只是指出我做错事的正确方向。基本上,这应该可以根据任何用户输入组成一个完整的句子,但 -AllCaps 除外,它运行正常。我的问题是另一部分。

param ($title, [switch]$AllCaps)
$ex="to|a|the|at|in|of|with|and|but|or"
function Proper($ts)
{
$nt=foreach($word in $ts)
{
    $word=$word.ToLower()

    if($word -match $ex)
    {
        if($word -eq $ts[0])
        {
            $letters=$word -csplit("")
            $letters[1]=$letters[1].ToUpper()
            $word=$letters -join("")
        }
        else
        {
            $word=$word
        }
    }
    else
    {
        $letters=$word -csplit("")
        $letters[1]=$letters[1].ToUpper()
        $word=$letters -join("")
    }
    "$word"
}
$nt=$nt -join(" ")
Write-host $nt
}

if($AllCaps)
{
$title=$title.ToUpper()
    "$title"
}
else
{
    $ts=$title -split(" ")
    $newtitle=Proper $ts
}     

因此,当我执行传入 "the waffle of kings" 的脚本时,预期输出是 "The Waffle of Kings" - 相反,代码似乎完全忽略了第一个 [=20] 中的 "else" =] 语句,我得到的输出是 "The waffle of kings"。由于 "waffle" 不匹配 $ex 中的任何内容,它应该移动到 else 部分,将第一个字母大写。

不太值得注意的是,它不会在没有在 foreach 循环中包含“$word”的情况下写入控制台,尽管按照我编写的方式,Write-Host 应该为我这样做。如果我取出 write-host 没有任何变化,但如果我在循环中取出“$word”,我根本没有输出。

使用上面提到的

$ex='^(to|a|the|at|in|of|with|and|but|or)$'

我最终得到了一个很好的单行,但在这里扩展了它:

Function Proper($words)
{
  $ex='^(to|a|the|at|in|of|with|and|but|or)$'
  $nt = $(
    foreach ($word in $words)
    {
      $word = $word.ToLower();
      if ($word -match $ex)
      {
        $word
      } else
      {
        $word = ([String]$word[0]).ToUpper()+$word.Substring(1);
        $word
      }
    }
  ) -join " "
  return $nt
}

希望对您有所帮助。

谢谢,克里斯。