Powershell:Switch语句丢失了管道中的对象

时间:2014-01-16 17:58:15

标签: powershell

我遇到PowerShell 3.0的问题,这在PowerShell 2.0中没有出现。当我执行此代码时,将记录导入$_后,我输出CSV文件中的字段。没关系。当它调用函数以前使用Switch语句执行相同的操作时,它在$_变量中不再可用。如果我删除该函数并将Switch语句放在ForEach和Write-Host中,它输出就好了。有没有人对此有任何见解,以及如何解决这个问题?谢谢!

Function print {

    Switch -regex ("m") {
        "[a-b]" { $x = "ab"; break }
        "[c-d]" { $x = "cd"; break }
        "[e-f]" { $x = "ef"; break }
        "[g-h]" { $x = "gh"; break }
        "[i-j]" { $x = "ij"; break }
        "[k-l]" { $x = "kl"; break }
        "[m-n]" { $x = "mn"; break }
        "[o-p]" { $x = "op"; break }
        "[q-r]" { $x = "qr"; break }
        "[s-t]" { $x = "st"; break }
        "[u-v]" { $x = "uv"; break }
        "[w-x]" { $x = "wx"; break }
        "[y-z]" { $x = "yz"; break }
    }

    Write-Host $_.givenname
    Write-Host $_.surname
    Write-Host $_.username

}


Import-Csv -Delimiter "`t" ("D:\alphabet.csv") | `
    Foreach {

        Write-Host $_.givenname
        Write-Host $_.surname
        Write-Host $_.username

        print
}

1 个答案:

答案 0 :(得分:0)

为什么不直接将$_值传递给print函数?首先定义print函数以获取参数

Function print {
  param ($value)

  Switch -regex ("m") {
   ...
  }

  Write-Host $value.givenname
  Write-Host $value.surname
  Write-Host $value.username

}

然后将其传递给函数

Import-Csv -Delimiter "`t" ("D:\alphabet.csv") | `
    Foreach {

        Write-Host $_.givenname
        Write-Host $_.surname
        Write-Host $_.username

        print $_
}

注意我不确定为什么这两个版本之间发生了变化。我的猜测是2.0中的行为只是实施的意外而不一定是环境意图。