【问题标题】:Cmd Variables with Reserved Character %带有保留字符 % 的 Cmd 变量
【发布时间】:2020-01-17 19:36:49
【问题描述】:

我有一个服务帐户,我正在尝试为其分配一个变量 - 我无法更改密码。

密码是“密码%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 日志后,批处理立即退出。

有什么办法可以代替 CALL 吗?我将如何进行设置

【问题讨论】:

  • 如果 %% 不起作用,请尝试转义字符 ^%
  • 当您在命令提示符下工作时,(这不是批处理文件)SET $9=password%%6k 应该是 Set "$9=password%6k"call startmaxl.bat %$9% 应该是 @987654329 @ 和内部 startmaxl.bat %~1 将表示最初设置为名为 $9 的变量的值。在startmaxl.bat 中,您应该在需要删除封闭双引号的地方或必要时使用%~1,并在需要它们的地方使用%1因为它已经被双引号传递了

标签: variables cmd set


【解决方案1】:

Each CALL does one substitution of the variables(请参阅以下简单 .bat 脚本的前 2 行输出)。您可以按如下方式申请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]

【讨论】:

  • 谢谢!!那行得通!我使用 "$9=password%%6K" 然后回显 $9=%9% (CALL echo^) 然后回显 $9 来查看。在第 9 个变量的 MAXL 脚本中,我写了“%9%”,并将其适当地输入到 MAXL 引擎中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多