如何在批处理文件中转义此命令?

时间:2018-11-28 11:45:47

标签: batch-file cmd pg-dump

我想为PG_DUMP动态生成一组开关,如下所示:

--table=mySchema.foo --table=mySchema.bar ...

但是,我想将这些开关限制为仅视图。视图名称不遵循模式。它们都驻留在称为mySchema的单一模式中。

这是我写的批处理文件脚本:

@echo off

set PARAM_HOTE=localhost

set PARAM_PORT=5435

set PSQL="C:\Program Files\PostgreSQL\9.4\bin\psql.exe"

set SQL_QUERY=^
select string_agg( '--table=' || quote_ident(nspname) || '.' || quote_ident(relname), ' ' )^
  from (^
      select *^
        from pg_class^
        join pg_namespace on pg_namespace.oid = pg_class.relnamespace^
       where relkind = 'v'^
         and nspname = 'mySchema'^
    order by relname ASC^
  ) infos_vues^
;

for /f %%i in ('"%PSQL%" --quiet --tuples-only --host %PARAM_HOTE% --port %PARAM_PORT% --username "rec" -c "%SQL_QUERY%" db') do set PG_DUMP_SWITCHES_FOR_VIEWS_ONLY=%%i

:: Call PG_DUMP...

运行它时,出现以下错误:

  

'"C:\Program Files\PostgreSQL\9.4\bin\psql.exe"" -c "select'不被认为是内部       或外部命令,可操作程序或批处理文件。

1 个答案:

答案 0 :(得分:1)

这是我解决问题的方法:

@echo off

set PARAM_HOTE=localhost

set PARAM_PORT=5435

set PSQL="C:\Program Files\PostgreSQL\9.2\bin\psql.exe"

set SQL_LISTE_VUES=^
select string_agg( concat('--table=' , quote_ident(nspname) , '.' , quote_ident(relname)), ' ' )^
  from (^
      select *^
        from pg_class^
        join pg_namespace on pg_namespace.oid = pg_class.relnamespace^
       where relkind = 'v'^
         and nspname = 'rec'^
    order by relname ASC^
  ) infos_vues^
;

for /f  "usebackq delims=" %%i in (`%%PSQL%% --quiet --tuples-only --host %PARAM_HOTE% --port %PARAM_PORT% --username "rec" -c "%SQL_LISTE_VUES%" REC`) do set LISTE_VUES=%%i
echo %LISTE_VUES%
  • 我用||函数替换了concat,从而重写了查询
  • 我用了倒勾
  • 我在%命令中用%%转义了for