首页 > 解决方案 > 批处理文件和等待 - MAXL

问题描述

由于某种原因,该批次直到批次结束时才运行 MAXL。我试图在程序开始时输出一个日志文件,运行 MAXL,然后告诉我文件何时完成。

REM Variables 1-9 assigned SET $1=variable1
CALL    :SUB_A
CALL    :SUB_B
CALL    :SUB_C

GOTO    :EOF

:SUB_A
    ECHO STARTING Rebuild_TEST - Started at %time% on %date% > D:\Logs\Rebuild_TEST_Start.log
EXIT /B
:SUB_C
    ECHO ENDING Rebuild_TEST - Started at %time% on %date% > D:\Logs\Rebuild_TEST_END.log
EXIT /B

:SUB_B
    ECHO STARTING REBUILD
    START "REBUILD" /W /B D:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin\startMaxl.bat Rebuild_TEST.msh %$1% %$2% %$3% %$4% %$5% %$6% %$7% %$8% %$9%
    ECHO ENDING REBUILD
EXIT /B

:EOF

我看到的是脚本通过 Subs AC 然后执行 MAXL。我期待 Sub A 执行,Sub B 执行 - 启动 MAXL,然后运行 ​​SUB_C。

我究竟做错了什么?我包括 /W 等待, /B 在当前窗口中运行文件,所以我不必干预

如果我用 START "REBUILD" /W CMD /c 运行它,也许效果会更好?

标签: batch-filecmdsubroutine

解决方案


想出了这个。有两个问题,1) MAXL.bat 在批处理完成时终止当前进程 - 这需要打开一个新的终端窗口 2) 我的密码有一个保留字符,这让我抓狂。回显它会有所帮助,但有时您需要在传递给 maxl 时将变量包含在 "" 中

StartMAXL.bat 用于 Oracle Essbase 数据加载/重建/等。.bat 通常是 7 个文件夹。

要运行 MAXL,请列出 StartMAXL.bat 的完整路径,然后在 .msh 文件中传递命令列表,后跟变量/参数。

将此保存为 Essbase_Rebuild.cmd 文件 这是基本的 MAXL Cmd 行调用

SET $1=[Essbase Username]
SET $2=[Essbase Password]
SET $3=localhost REM /*This is performed on the essbase server*/
SET $4=[Target Application Name]
SET $5=[Target App Cube Name]
SET $6=[source app]
SET $7=[source cube]
SET $8=[SQL Username]
SET "$9=[SQL password]" REM if you have special characters they might error in MAXL

D:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin\startMaxl.bat Essbase_Code_File.msh %$1% %$2% %$3% %$4% %$5% %$6% %$7% %$8% %$9%

现在为您的 Essbase_Code_File.msh 文件/或您正在做的 Essbase 事情列表

login $1 identified by $2 on $3;
spool on to 'D:\\Logs\\Essbase_Code_File.log';
/* do your MAXL commands */
spool off; 
logout;
exit;

上述方法适用于简单方法 - 有时您可能需要将 %9% 变量包含在 "%9%" 中,以便 MAXL 正确解释变量。在 .msh 中回显您的变量,通过添加 shell echo "$1" 在命令提示符中查看它;登录前到您的 .msh。

更优雅的版本花了 3 个月才弄明白 命名为 Essbase_Code_File.cmd

REM Parameters
SET $1=[Essbase Username]
-- repeat for your variables

CALL :SUB_A
CALL :SUB_B
CALL :SUB_C

GOTO :EOF

:SUB_A
ECHO Starting the Rebuild - Started @ %time% on %date% >D:\Logs\Rebuild_Start.log
EXIT /B

:SUB_B
ECHO STARTING REBUILD
START "ESSBASE_EXAMPLE" /W CMD /C D:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin\startMaxl.bat Essbase_Code_File.msh %$1% %$2% %$3% %$4% %$5% %$6% %$7% %$8% %$9%
EXIT /B

:SUB_C
ECHO Ending the Rebuild - Ending @ %time% on %date% >D:\Logs\Rebuild_End.log
EXIT /B

:EOF

我喜欢这种方法,因为命令提示符没有被重命名 - 记录开始/结束时间,重建发生在新窗口中,然后在完成时关闭,


推荐阅读