Batch file 是否可以在批处理文件中将系统变量传递给ogr2ogr

Batch file 是否可以在批处理文件中将系统变量传递给ogr2ogr,batch-file,gdal,ogr,Batch File,Gdal,Ogr,我的组织使用批处理文件对我们的数据库执行查询,我遇到了一种情况,在这种情况下,我需要执行一个太大的查询,无法同时执行所有查询。因此,我所做的是修改一个批处理文件,使其在文本文件中循环,并单独查询每一行,然后将结果附加到输出文件中 问题是,当我回显查询变量时,它的读取结果与预期完全一致,但当我将其传递给ogr而不是sql字符串时,它似乎是空的。我不确定我是否做错了什么,或者我想做的是不可能的。有人能澄清这里发生了什么吗 SET Path=\\my\path\blah\gdal\bin SET GD

我的组织使用批处理文件对我们的数据库执行查询,我遇到了一种情况,在这种情况下,我需要执行一个太大的查询,无法同时执行所有查询。因此,我所做的是修改一个批处理文件,使其在文本文件中循环,并单独查询每一行,然后将结果附加到输出文件中

问题是,当我回显查询变量时,它的读取结果与预期完全一致,但当我将其传递给ogr而不是sql字符串时,它似乎是空的。我不确定我是否做错了什么,或者我想做的是不可能的。有人能澄清这里发生了什么吗

SET Path=\\my\path\blah\gdal\bin
SET GDAL_DATA=\\my\path\blah\gdal\data

@echo off
SET "file=C:\filepath.txt"
SET /A i=0

REM put file into array line by line
for /F "usebackq delims=" %%a in ("%file%") DO (
set /A i+=1
call set array[%%i%%]=%%a
call set n=%%i%%
)
REM Loop through array entries
for /L %%i in (1,1, %n%) DO (
REM Create SQL String
call set "queryStart="SELECT * FROM _tablename WHERE _fieldname IN ('"
call set uid=%%array[%%i]%%
call set "queryEnd=')""
call set call set "fullQuery=%%queryStart%%%%uid%%%%queryEnd%%"
REM Database Request
ogr2ogr -skipfailures -update -append -s_srs EPSG:4326 -t_srs EPSG:4326 -f "FileGDB" C:\blah\MyExport.gdb PG:"dbname=instagram host=hostservername user=username password=password" -sql %fullquery% -nln "LayerName" -nlt POINT --config FGDB_BULK_LOAD yes
)
pause;
从路径中删除所有元素不是一个好主意 无需在每次迭代中定义查询的开始和结束 查询中的括号可能有问题,请将其转义 不需要数组,因此直接读取文件并在查询中使用读取值。 为了更好地阅读代码,我将行拆分。我不知道ogr2ogr是否会抱怨 当然,并不是所有的更改都需要,只是为了让它更具可读性


在这一切之后,如果我不得不打赌的话,你的问题就在括号里。但是我不能测试它。

这可能是一个过程,但它只传递了文件的内容,而不是sql的开始和结束string@brock,你是如何决定的?我看到两个变量在这行中定义和使用。您是否尝试过删除echo以查看执行的行?为什么它会从文本文件中传递该行,而不传递我的其他变量?是的,我删除了echo以查看它在做什么,它读取…-sql[contents of file]-nln…@brock,如果此代码包含在外部块中,我可以看到此行为的唯一原因。然后,如果在同一块中更改和访问变量queryStart和queryEnd,则在没有延迟扩展的情况下,将无法看到将位于外部块内的变量queryStart和queryEnd的赋值。是这样吗?
SET Path=\\my\path\blah\gdal\bin;%PATH%
SET GDAL_DATA=\\my\path\blah\gdal\data

@echo off
    SET "file=C:\filepath.txt"
    SET /A i=0

    set "queryStart=SELECT * FROM _tablename WHERE _fieldname IN ^('"
    set "queryEnd='^)"

REM put file into array line by line
    for /F "usebackq delims=" %%a in ("%file%") DO (
        ogr2ogr -skipfailures -update -append -s_srs EPSG:4326 -t_srs EPSG:4326 ^
                -f "FileGDB" C:\blah\MyExport.gdb PG:"dbname=instagram host=hostservername user=username password=password" ^
                -sql  "%queryStart%%%a%queryEnd%" ^
                -nln "LayerName" -nlt POINT --config FGDB_BULK_LOAD yes
    )