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()