Powershell 到 SQL 数据库
Powershell to SQL database
我最初的 post 是如何将数据直接从管道传递到(远程)SQL 数据库。写入 CSV,然后数据库无法处理我正在处理的数据量——我正在查询超过 200 万个文件。
下面是我想出的最终脚本。它扫描文件服务器,在管道中进行过滤,创建一个具有文件属性的 PSObject,然后将对象的属性存储到变量中。然后将这些变量传递给 SQL 查询字符串。这有点麻烦,但我看不到另一种将文件属性直接读入查询字符串的方法。
我还需要一种远程 运行 的方法。
在 Invoke-SQLCmd2
的帮助下,您可以从 SQL 服务器数据库写入和读取数据。更多信息 here.
我不确定,但我认为此 CmdLet 不接受管道输入。因此,最好的办法是将代码转换为 Foreach
结构,并在每次您想执行 INSERT
或其他操作时调用 Cmdlet Invoke-SQLcmd2
。
像这样:
$CSV = Get-Content -Path "D:\FS01-USER-Files$name.csv"
Foreach ($Line in $CSV) {
Invoke-Sqlcmd2 @SQLParams -Query "
INSERT INTO $SQLTable
(FileName, Data)
VALUES('$Line.FileName', '$($Line.Data)')"
}
这怎么可能是 运行 另一个拥有域权限的帐户?
您可以将 Scheduled Task
运行 设置为另一个用户,并存储密码。然后可以由对已创建 Scheduled Task
的服务器具有 RDP 访问权限的其他用户触发此任务。
$ErrorActionPreference = "SilentlyContinue"
$cutOffDate = (Get-Date).addYears(-1)
$exclusions = @(".lnk",".url",".ini",".odc",".ctx",".upd",".ica")
$connectionString = "Server=db01;Database=Files;Integrated Security=True;"
$count = 0
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
gci "D:\USERS" -Recurse | ? {
$_.PSIsContainer -eq $False -and
$_.LastAccessTime -le $cutOffDate -and
$exclusions -notcontains $_.Extension -and
$_.length -gt "0" -and
$_.Directory -notmatch ".*USERS\.*\Personal\sysdata\cookies"
} | % {
$obj = New-Object PSObject
$obj | Add-Member NoteProperty Directory $_.DirectoryName
$obj | Add-Member NoteProperty Name $_.Name
$obj | Add-Member NoteProperty MB ("{0:N3}" -f ($_.Length/1MB))
$obj | Add-Member NoteProperty LastAccessed $_.LastAccessTime
$obj | Add-Member NoteProperty LastMofified $_.LastWriteTime
$obj | Add-Member NoteProperty Created $_.creationtime
$obj | Add-Member NoteProperty Extension $_.Extension
$v1 = $obj.Directory
$v2 = $obj.Name
$v3 = $obj.MB
$v4 = $obj.LastAccessed
$v5 = $obj.LastMofified
$v6 = $obj.Created
$v7 = $obj.Extension
$query = "INSERT INTO dbo.fs01 (directoryPath,fName,fileSize,lastAccessed,lastModified,createdDate,extension) VALUES ('$v1','$v2','$v3','$v4','$v5','$v6','$v7');"
$command = $connection.CreateCommand()
$command.CommandText = $query
$command.ExecuteNonQuery()
}
$connection.close()
我最初的 post 是如何将数据直接从管道传递到(远程)SQL 数据库。写入 CSV,然后数据库无法处理我正在处理的数据量——我正在查询超过 200 万个文件。
下面是我想出的最终脚本。它扫描文件服务器,在管道中进行过滤,创建一个具有文件属性的 PSObject,然后将对象的属性存储到变量中。然后将这些变量传递给 SQL 查询字符串。这有点麻烦,但我看不到另一种将文件属性直接读入查询字符串的方法。
我还需要一种远程 运行 的方法。
在 Invoke-SQLCmd2
的帮助下,您可以从 SQL 服务器数据库写入和读取数据。更多信息 here.
我不确定,但我认为此 CmdLet 不接受管道输入。因此,最好的办法是将代码转换为 Foreach
结构,并在每次您想执行 INSERT
或其他操作时调用 Cmdlet Invoke-SQLcmd2
。
像这样:
$CSV = Get-Content -Path "D:\FS01-USER-Files$name.csv"
Foreach ($Line in $CSV) {
Invoke-Sqlcmd2 @SQLParams -Query "
INSERT INTO $SQLTable
(FileName, Data)
VALUES('$Line.FileName', '$($Line.Data)')"
}
这怎么可能是 运行 另一个拥有域权限的帐户?
您可以将 Scheduled Task
运行 设置为另一个用户,并存储密码。然后可以由对已创建 Scheduled Task
的服务器具有 RDP 访问权限的其他用户触发此任务。
$ErrorActionPreference = "SilentlyContinue"
$cutOffDate = (Get-Date).addYears(-1)
$exclusions = @(".lnk",".url",".ini",".odc",".ctx",".upd",".ica")
$connectionString = "Server=db01;Database=Files;Integrated Security=True;"
$count = 0
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
gci "D:\USERS" -Recurse | ? {
$_.PSIsContainer -eq $False -and
$_.LastAccessTime -le $cutOffDate -and
$exclusions -notcontains $_.Extension -and
$_.length -gt "0" -and
$_.Directory -notmatch ".*USERS\.*\Personal\sysdata\cookies"
} | % {
$obj = New-Object PSObject
$obj | Add-Member NoteProperty Directory $_.DirectoryName
$obj | Add-Member NoteProperty Name $_.Name
$obj | Add-Member NoteProperty MB ("{0:N3}" -f ($_.Length/1MB))
$obj | Add-Member NoteProperty LastAccessed $_.LastAccessTime
$obj | Add-Member NoteProperty LastMofified $_.LastWriteTime
$obj | Add-Member NoteProperty Created $_.creationtime
$obj | Add-Member NoteProperty Extension $_.Extension
$v1 = $obj.Directory
$v2 = $obj.Name
$v3 = $obj.MB
$v4 = $obj.LastAccessed
$v5 = $obj.LastMofified
$v6 = $obj.Created
$v7 = $obj.Extension
$query = "INSERT INTO dbo.fs01 (directoryPath,fName,fileSize,lastAccessed,lastModified,createdDate,extension) VALUES ('$v1','$v2','$v3','$v4','$v5','$v6','$v7');"
$command = $connection.CreateCommand()
$command.CommandText = $query
$command.ExecuteNonQuery()
}
$connection.close()