在批处理文件中运行命令

时间:2018-06-26 05:26:25

标签: 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 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)

1 个答案:

答案 0 :(得分:2)

有两个错误:您无法将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:\Program Files\是一个非常糟糕的主意。该目录具有特定用途的特殊权限。您应该使用%ProgramData%%AppData%