在启用延迟扩展的情况下将带有特殊字符的参数传递给批处理脚本

问题描述 投票:0回答:1

我需要调用一个接受密码作为其参数之一的脚本。每当密码包含,时,它将被视为定界符,并且密码将被分为两个参数,并且当密码包含!时,将忽略所有特殊字符。我尝试将它们包含在'"中,并对密码进行预处理以同时使用^^^进行转义。不幸的是,没有任何效果。如何在密码中保留这些特殊字符?

batch-file cmd
1个回答
0
投票

您是正确的,必须暂时禁用延迟扩展才能正常工作。 !必须转义,引用会处理其余部分:

@echo off
setlocal enabledelayedexpansion

REM --- get parameter ---
setlocal disabledelayedexpansion
set "x=%~1"
endlocal & set "x=%x:!=^!%"
REM --- end get param ---

set x
echo "!x!"

输出:

C:\TEST>test.bat "pass,!<& %|>word"
x=pass,!<& %|>word
"pass,!<& %|>word"

主要技巧是endlocal & set "x=%x:!=^!%"行。 set命令仍然是[[parsed,没有延迟扩展,但在endlocal之后是exected(因为整行在执行任何命令之前已被分析-是的,很奇怪的事情...)]

© www.soinside.com 2019 - 2024. All rights reserved.