我有一个脚本,它读取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每次调用$myarray1或任何其他数字时,它都会添加一个空格。这不太好,因为这将为它在我的DB中提取的每个名称创建一个重复条目。
我们有一个现有的".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 ','~ ','~ ') )发布于 2018-05-10 13:58:40
在字符串构建中使用逗号是造成此问题的原因。我看到您在字符串末尾也使用了一个-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注入,因为这超出了问题的范围。
https://stackoverflow.com/questions/50274406
复制相似问题