预期行为:
有一个PS脚本,可浏览文件目录并获取所有目录详细信息(正常运行) 将那些详细信息写回到SQL表中(有效) 该脚本正在运行,但是失败,并显示如下错误:
ForEach-Object:使用“ 0”参数调用“ ExecuteNonQuery”的异常:“'EGIDIO'附近的语法不正确”
我知道是由撇号引起的。失败时读取的文件夹称为“ D'EGIDIO,SHAH&TOWNSEND”。
问题是我似乎无法弄清楚如何在PS脚本或脚本中的sql插入中替换该文本。无论我尝试什么,它仍然会失败。
#Invoke-sqlcmd Connection string parameters
$params = @{'server'='TESTServer';'Database'='_Maintenance'}
#Server to query WMI class win32_logicalDisks
$server = 'TESTServer'
#Prepare Insert Statement
$insert = @'
INSERT INTO [_PBS_Maintenance].[dbo].[Maint_DiskSpace](Path,SizeInMB,SizeInGB,FileLastModified,CreatedDate,CreatedBY)
VALUES (
'{0}',
'{1}',
'{2}',
'{3}',
GetDate(),
SYSTEM_USER
)
'@
write-host $insert
Try {
#Define connction string of target database
$connectionString = 'Data Source=PBSNV800IMG1\PBSNV800IMG1;Initial Catalog=_PBS_Maintenance;Integrated Security=SSPI'
# connection object initialization
$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)
#Open the Connection
$conn.Open()
# Prepare the SQL
$cmd = $conn.CreateCommand()
$array= @()
$folder = "\\fsvr\Public\Users\Valorie L\Valorie\ATTORNEY\EIC-ERMG\"
$Source = $folder
Get-ChildItem -Recurse $Source | Where-Object { $_.PSIsContainer } |
ForEach-Object {
$obj = New-Object PSObject
$SizeMB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1MB, 2)
$SizeGB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB, 2)
$obj |Add-Member -MemberType NoteProperty -Name "Path" $_.FullName
$obj |Add-Member -MemberType NoteProperty -Name "SizeMB" $SizeMB
$obj |Add-Member -MemberType NoteProperty -Name "SizeGB" $SizeGB
$obj |Add-Member -MemberType NoteProperty -Name "DateModified" $_.LastWritetime
$array +=$obj
select Path,SizeMB,DateModified
ForEach-Object{
$cmd.CommandText = $insert -f $obj.Path,$obj.SizeMB,$obj.SizeGB, $obj.DateModified
$cmd.ExecuteNonQuery()
}
}
#Close the connection
$conn.Close()
}
Catch {
Throw $_
}
Invoke-Sqlcmd @params -Query "SELECT * FROM Maint_DiskSpae" | format-table -AutoSize
1个
在SQL中,通过将单引号加倍将其转义(两个单引号' ',而不是双引号")。在此行的情况下,您需要执行以下操作:
$obj |Add-Member -MemberType NoteProperty -Name "Path" $_.FullName
稍微修改一下,用两个单引号替换任何单引号,如下所示:
$obj |Add-Member -MemberType NoteProperty -Name "Path" ( $_.FullName -replace "'", "''" )
它是如何工作的是子表达式,$_.FullName因此我们可以使用-replace运算符将路径中的任何单引号替换为两个单引号。首先评估子表达式,然后将返回的值作为上的Path属性的值应用于父范围$obj。
请注意,请确保转义在文件夹路径中允许作为SQL查询一部分转义的所有字符,以及为防止SQL注入攻击而应转义的字符,转义。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。