我有一个脚本,它读取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 ','~ ','~ ') )
答案 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注入,因为这超出了问题的范围。