我正在尝试将存储在.csv文件中的大量数据上传到远程MSSQL。
我找到了工作解决方案(至少对于同步模式)here。
我正试图通过Powershell工作开始使用asyncronous模式,但它失败了。
这是代码:
Get-ChildItem "G:\Data\*.csv" | % {
Start-job -Name "$($_)" -InitializationScript {Ipmo Functions -Force -DisableNameChecking} `
-ScriptBlock { $DataImport = Import-Csv -Path $args[0]
$DataTable = Out-DataTable -InputObject $DataImport
Write-DataTable -ServerInstance "MSSQL" `
-Database "database" `
-TableName "table" `
-Username "user" `
-Password "pwd" `
-Data $DataTable
} -ArgumentList $_.fullname}
我收到错误:
Ipmo:未加载指定的模块“Functions”,因为在任何模块目录中都找不到有效的模块文件。 在行:1个字符:1 + Ipmo函数-Force -DisableNameChecking + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ResourceUnavailable :( Functions:String)[Import-Module],FileNotFoundException + FullyQualifiedErrorId:Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
有人可以帮忙吗?
答案 0 :(得分:1)
以这种方式使用Start-Job处理这些文件而不限制您正在创建的作业数可能不是很高效。也就是说,如果有1000个CSV文件,那么您将创建1000个作业。如果您使用的是PowerShell V3或更高版本,则可以尝试工作流来获得更“管理”的并行执行:
workflow Process-CsvFile([string[]]$Files) {
InlineScript { Import-Module Functions -DisableNameCheck }
foreach -parallel($file in $Files) {
InlineScript {
$DataImport = Import-Csv -Path $args[0]
$DataTable = Out-DataTable -InputObject $DataImport
Write-DataTable -ServerInstance "MSSQL" `
-Database "database" `
-TableName "table" `
-Username "user" `
-Password "pwd" `
-Data $DataTable
}
}
}
$files = Get-ChildItem G:\Data\*.csv| Foreach FullName
Process-CsvFile $files
关于导入函数时出错的问题。需要将Out-DataTable
和Write-DataTable
函数复制到名为Functions.psm1的文件中,并将该文件放在两个位置之一 - $home\Documents\WindowsPowerShell\Modules\Functions\Functions.psm1
或$pshome\Modules\Functions\Functions.psm1
。我建议把它放在你家里的第一个位置。将文件放在适当的位置后,打开PowerShell并执行ipmo Functions -DisableNameChecking
以验证您没有错误。
如果您不想并行执行,则需要修改使用Start-Job
的方式,因为这些作业并行运行。创建单个作业以在后台顺序运行CSV文件,例如:
$files = Get-ChildItem G:\Data\*.csv| Foreach FullName
Start-job -Name ProcessCsvFiles`
-InitializationScript {Ipmo Functions -Force -DisableNameChecking} `
-ScriptBlock {param($files)
foreach ($file in $files) {
$DataImport = Import-Csv -Path $file
$DataTable = Out-DataTable -InputObject $DataImport
Write-DataTable -ServerInstance "MSSQL" `
-Database "database" `
-TableName "table" `
-Username "user" `
-Password "pwd" `
-Data $DataTable
}
} -ArgumentList $files