背景: 操作系统Win10 PostgreSQL的9.6 海报2.5
故事: 我在win文件夹中有200个带有postgres(st_union函数)查询的.slq脚本。 我可以在这些文件上并行运行“。(%。f在(* .sql)中执行(启动cmd / c“ psql -U postgres -f” %% f“ abn2030”)“。bat,我的8个内核有一些饲料。 EXCEPT 200脚本太多了。我正在寻找一种方法来限制正在运行的“ cmd” /“ psql”实例。我想检查cmd(或psql)实例是否正在运行,并且仅在cmd / psql实例的数量小于15时才启动下一个(在线等待).sql脚本。(如果这有意义;也许还有其他选择) 。 我尝试了powershell和python(在较小程度上),但我不知道该用哪个(如果有的话)进行。
powershell: 直接运行。脚本执行没有问题。
cmd /c ""C:\PostgreSQL\9.6\bin\psql.exe" -U postgres -d db -f "D:\Dropbox\scripts_sql\execute_htunion\pwshl\queries1.SQL""
在脚本中:(大部分是从其他帖子中偷走的)
function numInstances([string]$process)
{
@(get-process -ea silentlycontinue $process).count
}
$files = Get-ChildItem $scriptDir\*.sql
foreach ($file in $files) {
$running = numInstances("cmd")
if ($running.Count -le 2) {
$script= {& cmd /c psql "-U postgres -f $file db"}
Start-Job $script
write-host "$file"
} else {
$running | Wait-Job
}
Get-Job | Receive-Job
}
输出:psql:致命:角色“ postgres -f D:\ Dropbox \ scripts_sql \ execute_htunion \ pwshl \ queri”不存在
如何使用Powershell(或其他语言)以psql命令发送启动.sql?
编辑:
在.bat中解决以下问题:
“ C:\ Program Files \ Git \ bin \ sh.exe” --login -i -c“发现。-iname'* .sql'-print0 | xargs --null --max-procs = 14 -I {} psql.exe -U postgres -d db -f {}“
答案 0 :(得分:1)
Git for Windows应具有xargs和find,它们是源自Linux的命令,一前一后是该任务的理想选择:
find . -name '*.sql' -print0 \
| xargs --null --max-procs=16 -I{} psql.exe -U postgres -d db -f {}