Переменные Cmd с зарезервированным символом% - PullRequest
0 голосов
/ 17 января 2020

У меня есть учетная запись службы, которой я пытаюсь присвоить переменную - я не могу изменить пароль.

Пароль - "пароль% 6k"

Я повторяю символ% для выхода

SET $9=password%%6k
REM $9

Cmd Output:
password%6k

call startmaxl.bat %$9%

-> In MAXL 
echo "$9";

MAXL Output:
passwordK

Это приводит к сбою пакета MAXL из-за неправильных учетных данных. Как это сделать? Я передаю правильно отформатированный пароль в движок MAXL?

Новый код:

SET "$9=password%%6k"
echo $9=%9%
CALL echo $9=%9%

Cmd Output:
echo $9=password%6k

MAXL:
shell echo "$9";
MAXL Output: password%6k
-- This is correct now 

Пакет затем ожидаемо завершается - я должен указать этот полный путь для запуска MAXL

Batch File Currently: 
echo Beginning Test at %time% on %date% > D:\Logs\TEST_START.log
SET (parameters 1-8)
SET "$9=password%%6k"
echo $9=%9%
CALL echo $9=%9%

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

echo Ending Test at %time% on %date% > D:\Logs\TEST_END.log

В настоящее время я могу пройти через правильный пароль создайте часть куба essbase, но пакет завершается сразу после выхода MAXL и пропуска последнего журнала TEST_END.

Есть ли в любом случае, чтобы сделать звонок? Как бы я go о настройке

1 Ответ

1 голос
/ 20 января 2020

Каждый CALL выполняет одну подстановку переменных (см. Первые 2 строки вывода из следующего простого сценария .bat). Вы можете применить DelayedExpansion следующим образом:

@ECHO OFF
rem setlocal script level 
SETLOCAL EnableExtensions DisableDelayedExpansion

rem percent sign escaped by doubling
SET "$9=password%%6k"

rem use the $9 variable                # %% => %
echo $9=%$9% (echo^)

rem CALL the $9 variable               # %6 => 6th line parameter
CALL echo $9=%$9% (CALL echo^)
echo ---

rem setlocal call level
SETLOCAL EnableDelayedExpansion
echo --- call startmaxl !$9:%%=%%%%!
call :startmaxl !$9:%%=%%%%!
rem endlocal call level 
ENDLOCAL

rem endlocal script level 
ENDLOCAL
goto :eof

rem the following procedure substitutes startmaxl.bat script
:startmaxl
echo in %~0 parameter=[%~1], variable=[%$9%]
goto :eof

Обратите внимание, что я вызываю внутреннюю подпрограмму (метку :startmaxl) вместо внешнего пакетного сценария (startmaxl.bat) без потери общности или точности . Вы можете использовать call startmaxl.bat !$9:%%=%%%%! с тем же результатом.

Вывод :

D:\bat\SO\59793838.bat a b c d e SixthParam g
$9=password%6k (echo)
$9=passwordSixthParamk (CALL echo)
---
--- call startmaxl password%%6k
in :startmaxl parameter=[password%6k], variable=[password%6k]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...