如何从数组中移除空间(powershell)

时间:2018-05-10 13:45:58

标签: sql powershell trim

我有一个脚本,它读取TAB分离的.TXT文件并从表中获取信息,然后根据列表中的名称创建一个.SQL脚本。但每次调用$ Variable [#]时都会增加额外的空间。 源数据中不存在此空间。我正在寻找一种修剪它的方法。

$start | Out-File -filepath $target1 -append

$infile = $source1
$reader = [System.IO.File]::OpenText($infile)
$writer = New-Object System.IO.StreamWriter $file1;

$counter = 1
try {
    while (($line = $reader.ReadLine()) -ne $null)
    {
        $myarray=$line -split "\t" | foreach {$_.Trim()}
If ($myarray[1] -eq "") {$myarray[1]=”~”}
If ($myarray[2] -eq "") {$myarray[2]=”~”}
If ($myarray[3] -eq "") {$myarray[3]=”~”}
If ($myarray[4] -eq "") {$myarray[4]=”~”}
If ($myarray[5] -eq "") {$myarray[5]=”~”}
        if ($myarray[0] -Match "\d{1,4}\.\d{1,3}"){
"go
Insert into #mytable Select convert(varchar(60),replace('OSFI Name: "+$myarray[1],$myarray[2],$myarray[3],$myarray[4],$myarray[5],"')), no_,branch,name,surname,midname,usual,bname2 
from cust where cust.surname in ('"+$myarray[2].,"',"+$myarray[1],"',"+$myarray[3],"',"+$myarray[4],"',"+$myarray[5],"')'  and ( name in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') or
midname in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') or
usualy in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') or
bname2 in ('"+$myarray[1],"','"+$myarray[2],"','"+$myarray[3],"','"+$myarray[4],"','"+$myarray[5],"') )
" -join "," | foreach {$_.Trim()} | Out-File -filepath $target1 -append


        }


            #$writer.WriteLine($original);

            #Write-Output  $original;
            #Write-Output  $newlin
    }
}
finally {
    $reader.Close()
    $writer.Close()
}

$end | Out-File -filepath $target1 -append

每当它调用$ myarray [1]或任何其他数字时,它会添加一个空格。这不好,因为这将为我在数据库中提取的每个名称创建一个重复的条目。

我们有一个现有的“.Java”脚本可以完成我想要实现的目标,所以我知道我的输出应该是什么样的。

我应该得到的输出看起来像:

go

Insert into #mytable Select convert(varchar(60),replace('OSFI Name: Fake Name Faker unreal   ','''''','''')), no_,branch,name,surname,midname,usual,bname2 
from cust where cust.surname in ('Faker unreal','Fake Name','~','~','~') and ( name in ('Fake Name', 'Faker unreal', '~', '~', '~') or 
midname in ('Fake Name', 'Faker unreal', '~', '~', '~') or 
usual in ('Fake Name', 'Faker unreal', '~', '~', '~') or 
bname2 in ('Fake Name', 'Faker unreal', '~', '~', '~') ) 

但我得到了

go
Insert into #mytable Select convert(varchar(60),replace('OSFI Name: Fake Name Fake Faker unreal ~ ~ ')), no_,branch,name,surname,midname,usual,bname2 
from cust where cust.surname in ('Fake Name ',unreal ',~ ',~ ')'  and ( name in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') or
midname in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') or
usualy in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') or
bname2 in ('Fake Name ','Fake Faker ','unreal ','~ ','~ ') )

1 个答案:

答案 0 :(得分:2)

在字符串构建中使用逗号会导致此问题。我看到你在该字符串的末尾也使用-join。这可以解释为什么你使用逗号,因为-join是一个数组运算符。从本质上讲,通过将其与基本字符串连接相结合,您将如何构建字符串。一个简单的示例,显示了问题(代码的次要重构以实现目标)

'"+$myarray[2].,"',"+$myarray[1],"',"+$myarray[3],"'

修复这些问题,您的问题应该消失(请参阅下面有关更好方法的部分)。这个逗号使得PowerShell将下一个字符串作为数组的一部分,因为它应该是一个字符串连接。当数组在PowerShell中展平为字符串时,元素以空格分隔。 问题不是数组元素中的空格,而是如何构建字符串。

比较这些结果,看看我的意思

$myarray = 65..90 | %{[string]([char]$_) * 4}

"'"+$myarray[2],"'"
"'"+$myarray[2]+"'"

'CCCC '
'CCCC'

在第一个输出示例中,2个元素数组$myarray[2],"'"被添加到字符串"'"中。在第二个引号中,然后将数组元素添加到字符串中,然后添加另一个引号。纯字符串连接。

考虑更好的字符串构建方法

知道还有其他方法可以做到这一点。如果有帮助,您可以使用子表达式和格式运算符。

"'$($myarray[2])','$($myarray[3])'"
"'{0}','{1}'" -f $myarray[2],$myarray[3]

SQL注入警告

您正在使用字符串连接手动构建sql代码。这意味着攻击者可能会在输入文件中添加恶意内容,您可以很好地执行此操作。您需要使用命令参数化。查找SQL注入,因为这超出了问题的范围。