Postgresql 在批处理文件中运行命令

Postgresql 在批处理文件中运行命令,postgresql,batch-file,command-prompt,Postgresql,Batch File,Command Prompt,我正在尝试创建一个批处理文件来运行一些微服务和数据库 1 FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :1000') DO @ECHO TaskKill.exe /PID %%P 2 FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :1001') DO @ECHO TaskKill.exe /PID %%P 3 FO

我正在尝试创建一个批处理文件来运行一些微服务和数据库

   1 FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :1000') DO @ECHO TaskKill.exe /PID %%P
   2 FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :1001') DO @ECHO TaskKill.exe /PID %%P
   3 FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :5432') DO @ECHO TaskKill.exe /PID %%P
   4 start cd "C:\Program Files\PostgreSQL\10\bin\" & pg_ctl.exe -D "c:\Program Files\PostgreSQL\10\data" start 
    @REM to start service
   5 start javaw -jar -Dserver.port=1000 text-annotation-tool-1.0-SNAPSHOT.jar
当通过注释第4行执行时,第1至3行和第5行正确执行

第4行是在新的提示符下启动Postgres服务器(因为目录发生了变化)。我认为问题在于我使用引号的方式。4号线起点和终点的“起点”有不同的用途


另外,如果我在不同的提示符下执行第4行,我如何在执行后关闭提示符(相当于nohup)

有两个错误:您不能“传递”
cd
到start命令。而
start
有一个怪癖,就是将第一个引用的参数解释为新窗口的标题。因此,
启动“C:\Program Files\PostgreSQL\10\bin\”…
无法工作,您需要提供一个虚拟窗口标题。
&
似乎也错了

因此,您需要:

start "Postgres Server" "C:\Program Files\PostgreSQL\10\bin\pg_ctl.exe" -D "c:\Program Files\PostgreSQL\10\data" start
由于提供了
pg_ctl.exe
的完整路径,因此不需要
cd
。 但如果要为新流程定义默认目录,则必须使用
/D
参数:

start "Postgres Server" /D "C:\Program Files\PostgreSQL\10\bin" pg_ctl.exe -D "c:\Program Files\PostgreSQL\10\data" start


不相关,但是:将Postgres数据目录放入
c:\ProgramFiles\
是一个非常糟糕的主意。该目录具有特定用途的特殊权限。您应该使用
%ProgramData%
%AppData%
来代替

是的,关于“数据”目录,您是对的。这是postgres的默认设置。新工艺是否有nohup等效物。我的意思是,这个命令是在“Postgres服务器”过程中执行的。我们能抑制这种情况吗prompt@Betafish:不适用于普通批处理脚本。我用
.vbs
脚本做了类似的事情。我可以使用类似的命令先停止然后启动postgres服务器
启动“postgres服务器”/D“C:\Program Files\PostgreSQL\10\bin”pg\u ctl.exe-D“C:\Program Files\PostgreSQL\10\data”stop
“postgres服务器”/D“C:\Program Files\PostgreSQL\10\bin”pg\u ctl.exe-D”吗“c:\Program Files\PostgreSQL\10\data”start我不会使用
start
命令运行
pg_ctl…stop
,因为您想在重新启动Postgres之前等待结果。因此
pg_ctl-D…stop
然后
启动“Postgres”pg_ctl-D…start