在Where-Object中附加多个参数

时间:2012-08-31 08:02:58

标签: powershell config

在我的设计中,我遇到了一个问题,即:

在数据库中,Form表A,我定义了变量名“MyParams”,其值为“1,2,3”,或“2,3,5”或“5,6,9”,即变量将根据业务逻辑而改变。

在powershell中,下面的脚本将处理由〜分割的一些文本,它将检查从数据库中的变量“MyParams”中提取的列是否为空,如果任何具有空白值的列,它将排除此记录。

    Get-Content "${myFile}.tmp" | Where-Object { $_.Split("~")[1] -ne "" -and $_.Split("~")[2] -ne "" -and $_.Split("~")[3] -ne ""  }|Out-File $myFile -Encoding ASCII 

这里,$ 中的数字(1,2,3).Split(“〜”)[1] $ .Split(“〜”)[2] $ _。分割(“ 〜“)[3]来自变量”MyParams“,它被包含在数据库中。

我的问题是,MyParams的值经常会发生变化,我如何创建上面的代码来调整它?

我想也许我需要使用foreach-object内部Where-object,corrct?有人可以帮帮我吗? THX。

4 个答案:

答案 0 :(得分:1)

假设$myparams是一个类似1,2,3的数组:

Get-Content "${myFile}.tmp" | %{$splitted = $_ -split "~"; if(!($myparams | ?{$splitted[$_] -eq ""})){$_} }

答案 1 :(得分:0)

好吧,我解决了自己,我使用-and来组合所有的参数并返回bool值,经过测试,这有效。下面的代码示例可能无法正常工作,您需要将其格式化为一行,删除备用空格。

Get-Content "${sftpFile}.tmp2" | ForEach-Object {
$line = $_.Split("~");
$columnOverseeCount = $columnsOverseeList.Count;
if($columnOverseeCount -eq 0)
{
    if (($line[4] -ne ""))
    {
    [String]::Join("~", $line);
    }
}
else
{
    $columnOverseeFlag = $true;
    foreach($columnOverseeValue  in $columnsOverseeList)
    {
        $columnOverseeFlag = $columnOverseeFlag -and  ($line[$columnOverseeValue] -ne "");
    };
    if(($line[4] -ne "") -and $columnOverseeFlag)
    {
        [String]::Join("~", $line) | Out-File -Append $sftpFile -Encoding ASCII
    }
    else
    {
        [String]::Join("~", $line) | Out-File -Append "${sftpFile}.filterByColumns" -Encoding ASCII
    }
}

}

答案 2 :(得分:0)

我有同样的问题,发现你需要使用脚本块语法,如下所示:

Get-Module -ListAvailable | where {($_.Name -notlike "Microsoft*" -and $_.Name -notlike "PS*") -and $_.HelpInfoUri}

这使您可以访问PowerShell可用的标准logical operators,而不是仅限于此Where-Object

请参阅this TechNet article中的示例7

答案 3 :(得分:-1)

$myParams放入变量中,然后在Where-Object

中使用它
$myParams = "1,2,3"
$indexes = [int[]] $myParams.Split(',')

Get-Content "${myFile}.tmp" | Where-Object {
  $_.Split("~")[$indexes[0]] -ne "" -and 
  $_.Split("~")[$indexes[1]] -ne "" -and 
  $_.Split("~")[$indexes[2]] -ne ""  } | Out-File $myFile -Encoding ASCII