Win10下使用pgsql2shp无法按日期逐个导出shapefile问题咨询
问题原因与修正命令
你的原命令没有生效是因为混用了Linux Shell和Windows CMD的语法,同时pgsql2shp参数传参错误,具体问题点:
- 循环语法错误:
(1..50)是Bash的数字范围写法,Windows CMD不支持该写法,循环未按预期遍历1-50,仅将1..50作为单个字符串处理,最终只生成了一个文件 - 变量引用错误:SQL语句中
$i是Linux Shell的变量格式,Windows CMD下命令行直接执行时循环变量格式为%i,写入bat批处理执行时为%%i - 参数逻辑错误:数据库名后额外传入了
public.my_table整表导出参数,pgsql2shp同时接收到表名和查询语句时,会优先执行整表导出逻辑,忽略后续查询条件 - 引号嵌套错误:查询语句外层多余的转义引号会导致SQL解析异常,变量无法正常替换
直接在CMD窗口执行的正确命令
for /L %i in (1,1,50) do pgsql2shp -f %i.shp -h localhost -p my_port -u postgres -P my_code postgres "select * from my_table where date = %i"
命令说明:for /L %i in (1,1,50)是CMD下遍历1到50连续整数的标准写法,步长为1;移除了多余的表名参数,查询语句直接用双引号包裹,变量直接用%i替换。
写入.bat批处理文件执行的正确命令
如果把代码存为bat脚本双击运行,需要把循环变量改为双百分号:
@echo off for /L %%i in (1,1,50) do ( pgsql2shp -f %%i.shp -h localhost -p my_port -u postgres -P my_code postgres "select * from my_table where date = %%i" )
注意事项:如果你的
date字段是日期、字符串类型而非整数类型,需要给变量值包裹单引号做类型匹配,将查询部分修改为"select * from my_table where date = '%i'"(命令行版)或"select * from my_table where date = '%%i'"(批处理版),否则会抛出类型不匹配的报错。如果待导出的日期不是连续整数,建议先查询表中所有存在的日期值生成遍历列表,避免导出空的shapefile文件。
内容的提问来源于stack exchange,提问作者timetraveller007
相关产品推荐
相关产品推荐

