我正在尝试通过批处理文件选择postgres数据库。 postgres DB提供了一个命令行界面(psql),您可以在其中输入DB命令,这些命令在for循环中完成。看看pg_cmd是如何被拼接在一起的。 select pd_SelCmd回显到pg_SelCall。 在for语句中执行命令但由于select包含圆括号,它们会导致错误解释和错误: " FROM"此时无法在句法上进行处理。
圆括号如何进行转义才能让请求生效?
DB的预期响应如下:
max
-------------------------
2016-12-29 09:40:09.842
(1 Line)
到目前为止使用的批次是
setlocal enabledelayedexpansion
Set "PgRootPath=C:\Program Files\PostgreSql\9.5.5-1\bin"
Call :GetDoneTime 56665454 DONE_TIME
echo = DONE_TIME=!DONE_TIME!
Goto :EOF
:GetDoneTime
set "ERRORLEVEL="
set "MC_UID=%~1"
set "ReturnDoneTimeValueRef=%~2"
set "DataVal=NULL"
set "PGPASSWORD=frontenduser"
set "PGCLIENTENCODING=utf-8"
set pd_SelCmd=SELECT max(t.endDate) FROM Ticket t JOIN Device d on t.device_id = d.id WHERE t.state in ('APPROVED','IN_PROGRESS', 'IN_ACTIVITY') AND d.uid='!MC_UID!';
set pg_SelCall="!PgRootPath!\psql" -U frontenduser -h localhost -d ppsdb
REM if call to psql produces an fatal error, the error number will be passed to for loop on third parameter in third line
set pg_cmd="echo !pd_SelCmd! | !pg_SelCall! || echo/ & echo/ & call echo NULL NULL %%^^^errorlevel%%"
set "pg_cmd=!pg_cmd:)=^)!"
REM Execute PG command. Resulting DataValue obtained from third row
REM Check for errors of call
for /f "skip=2 tokens=1,2,3" %%i in ('!pg_cmd!') do (
REM Get value in first and second parameter from split - which is from third row
set "DataVal=%%i %%j"
REM If error happend, report it. Error code is obtained in 3rd parameter.
if "!DataVal!"=="NULL NULL" (
echo ## Postgres DB operation failed with ERROR: %%~k
set "DataVal=NULL"
) else (
REM Check if result is not valid
if "!DataVal:~0,1!"=="(" set "DataVal=NULL"
)
goto GotDoneTime
)
:GotDoneTime
if not '!ReturnDoneTimeValueRef!'=='' set "!ReturnDoneTimeValueRef!=!DataVal!"
if "!DataVal!"=="NULL" exit /b 1
exit /b 0
答案 0 :(得分:0)
这里只是一些错误。不幸的是,我不知道postgresql,也没有必要的数据库,所以我无法测试它,但是这里有...
首先,代码块(带括号的系列语句)中不允许使用标签,::
是一个损坏的标签。在代码块中,rem
应该用于备注。
接下来,将'!pg_cmd!
循环中的for
替换为type q41353737.txt
(其中q41353737.txt
是包含您发布的命令的预期数据输出的文件),然后{{ 1}}设置为dataval
BUT ,因为文件中有第四行,下一行也会被处理,09:40:09.842
将设置为{{1} }。
要解决此问题,您只需将其更改为
即可dataval
这样只处理第三行,然后毫不客气地终止Line)
循环。
下一个问题是你抱怨的问题。 rem If error happened, report it. Error code is obtained in 3rd parameter.
if not '%%~k'=='' echo ## Postgres DB operation failed with ERROR: %%~k
rem If operation succeeded, get value in second parameter from split - which is from second data column
if '%%~k'=='' SET DataVal=%%~j
goto done
)
:done
正在终止for
,因此您需要告诉)
该特定for ... (
是要执行的命令的一部分,而不是cmd
的{{1}},因此您需要使用插入符号)
变为for
最简单的方法可能是在(
之前添加一行
^)
应该在命令中使用必要的插入符号正确地为所有for
添加前缀。
我怀疑你也会遇到其他问题字符的问题,因此可能需要对set "pg_cmd=!pg_cmd:)=^)!"
应用类似的过程,即。
)
我必须离开它,因为我无法正确执行命令本身。