在我的设计中,我遇到了一个问题,即:
在数据库中,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。
答案 0 :(得分:1)
假设$myparams
是一个类似1,2,3
的数组:
Get-Content "${myFile}.tmp" | %{$splitted = $_ -split "~"; if(!($myparams | ?{$splitted[$_] -eq ""})){$_} }
答案 1 :(得分:0)
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