Sql 我的绳子断了

Sql 我的绳子断了,sql,powershell,Sql,Powershell,当我特别告诉Powershell将回车放在线路的末尾时,Powershell打断了我的思路 我有一个PS脚本,它应该以100人为一组编写一个批处理sql插入: function WriteBatch { echo $sql $Command.CommandText = $sql $Command.ExecuteNonQuery() } $server = "norcrpsqldev08" $Database = "SandBoxVinny" $Path = "Y

当我特别告诉Powershell将回车放在线路的末尾时,Powershell打断了我的思路

我有一个PS脚本,它应该以100人为一组编写一个批处理sql插入:

function WriteBatch {
    echo $sql
    $Command.CommandText = $sql
        $Command.ExecuteNonQuery()
}

$server = "norcrpsqldev08"
$Database = "SandBoxVinny"
$Path = "Y:\BMPS"
$Counter = 0

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "server='$Server';database='$Database';trusted_connection=true;"
$Connection.Open()
$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection
[string]$sql =     "
                begin 
                    insert into TestPowerShell(NameString, FileSize, Mode, Directory, CreationTime, LastAccessTime, LastWriteTime)
                    values " 

foreach($file in Get-ChildItem -Verbose -Recurse -Path $Path | Select-Object  Name, Length, Mode, Directory, CreationTime, LastAccessTime, LastWriteTime) {
    $fileName = $file.Name
    $fileSize = ([int]$file.Length)
    $fileMode = $file.Mode
    $fileDirectory = $file.Directory
    $fileCreationTime = [datetime]$file.CreationTime
    $fileLastAccessTime = [datetime]$file.LastAccessTime
    $fileLastWriteTime = [datetime]$file.LastWriteTime
    $sql = $sql + "('$fileName', '$fileSize', '$fileMode', '$fileDirectory', '$fileCreationTime', '$fileLastAccessTime', '$fileLastWriteTime'),`r`n"
    #$sql += "`n"
    $Counter++

    If($Counter -eq 100) {
        $sql = $sql.Trim().Trim(',')
        $sql = $sql + " End"
        WriteBatch
        $Counter = 0
        $sql = "
                begin 
                    insert into TestPowerShell(NameString, FileSize, Mode, Directory, CreationTime, LastAccessTime, LastWriteTime)
                    values " 
    }

}

if ($Counter -gt 0){
    $sql = $sql.Trim().Trim(',')
    $sql = $sql + " End"
    WriteBatch
}

$Connection.Close()
生成的字符串通常会在不应该出现的地方出现换行符:

结果:

    ('PCA - implementation demand post transfer 9.14.16.xlsx', '56191', '-a---', 'Y:\BMPS\Salesforce\Projects\Merging PCA org into RCA\Data Move\Data\Final Move\Final upload\Compare reports', '09/14/2016 17:46:30', '09/14/2016 17:52:08', '09/14/2016 17:52:08'),
('RCA - implementation demand post transfer 9.14.16_bad.xlsx', '55442', '-a---', 'Y:\BMPS\Salesforce\Projects\Merging PCA org into RCA\Data Move\Data\Final Move\Final upload\Compare reports', '09/14/2016 17:46:30', '09/14/2016 17:46:55', '09/14/2016 17:46:55'
),
('RCA System - post transfer 9.14.16 No account.xlsx', '40498', '-a---', 'Y:\BMPS\Salesforce\Projects\Merging PCA org into RCA\Data Move\Data\Final Move\Final upload\Compare reports', '09/14/2016 17:20:37', '09/14/2016 17:26:49', '09/14/2016 17:26:49'),
这应该是这样的:

    ('PCA - implementation demand post transfer 9.14.16.xlsx', '56191', '-a---', 'Y:\BMPS\Salesforce\Projects\Merging PCA org into RCA\Data Move\Data\Final Move\Final upload\Compare reports', '09/14/2016 17:46:30', '09/14/2016 17:52:08', '09/14/2016 17:52:08'),
('RCA - implementation demand post transfer 9.14.16_bad.xlsx', '55442', '-a---', 'Y:\BMPS\Salesforce\Projects\Merging PCA org into RCA\Data Move\Data\Final Move\Final upload\Compare reports', '09/14/2016 17:46:30', '09/14/2016 17:46:55', '09/14/2016 17:46:55'),
('RCA System - post transfer 9.14.16 No account.xlsx', '40498', '-a---', 'Y:\BMPS\Salesforce\Projects\Merging PCA org into RCA\Data Move\Data\Final Move\Final upload\Compare reports', '09/14/2016 17:20:37', '09/14/2016 17:26:49', '09/14/2016 17:26:49'),
这破坏了我的sql。有什么想法吗?

试试这个:

$Host.UI.RawUI.BufferSize= @{Width=5000;Height=100}
在旧版本的PowerShell上,您可能需要:

$Host.UI.RawUI.BufferSize=New-Object System.Management.Automation.Host.Size(5000, 100)
试试这个:

$Host.UI.RawUI.BufferSize= @{Width=5000;Height=100}
在旧版本的PowerShell上,您可能需要:

$Host.UI.RawUI.BufferSize=New-Object System.Management.Automation.Host.Size(5000, 100)

您在哪里查看结果?在文本编辑器中,cmd窗口?是否可能由于字符串长度和程序的原因,它们只是简单地包装?无论如何,您的SQL已损坏。不要通过字符串连接来构建SQL语句。它使您容易受到SQL注入(
);升降台--在文件名中有效)。这是一个一次性内部使用脚本。一旦项目完成就被扔掉了。感谢@AnsgarWiechers提供的信息,我们没有与sql inj匹配的文件名。您在哪里查看结果?在文本编辑器中,cmd窗口?是否可能由于字符串长度和程序的原因,它们只是简单地包装?无论如何,您的SQL已损坏。不要通过字符串连接来构建SQL语句。它使您容易受到SQL注入(
);升降台--在文件名中有效)。这是一个一次性内部使用脚本。一旦项目完成就被扔掉了。感谢您通过@AnsgarWiechers提供的信息,我们没有与sql inj匹配的文件名。这应该避免以牺牲一些虚拟内存为代价包装最多5000个字符的字符串。显然,价值观的选择取决于你。另外,如果这样做有效,您的$sql字符串就不会被破坏,只是按照Matt的建议包装了显示。我得到了以下信息:
异常设置“BufferSize”:“无法将”System.Collections.Hashtable“类型的”System.Collections.Hashtable“值转换为”System.Management.Automation.Host.Size“位于C:\LocalSourceSave\Datamap\PowerShellDatamapTextv3.ps1:1 char:16+$Host.UI.RawUI。听起来像是powershell版本的差异,我正在运行5.1。给我一分钟…这会因为占用虚拟内存而导致插入多达500k行而阻塞吗?它似乎工作得很好。没问题,它不会影响脚本的操作,只是显示输出。这应该避免以牺牲一些虚拟内存为代价,在最多5000个字符的字符串上换行。显然,价值观的选择取决于你。另外,如果这样做有效,您的$sql字符串就不会被破坏,只是按照Matt的建议包装了显示。我得到了以下信息:
异常设置“BufferSize”:“无法将”System.Collections.Hashtable“类型的”System.Collections.Hashtable“值转换为”System.Management.Automation.Host.Size“位于C:\LocalSourceSave\Datamap\PowerShellDatamapTextv3.ps1:1 char:16+$Host.UI.RawUI。听起来像是powershell版本的差异,我正在运行5.1。给我一分钟…这会因为占用虚拟内存而导致插入多达500k行而阻塞吗?它似乎工作得很好。没问题,它不会影响脚本的操作,只是显示输出。