0

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

4

1 回答 1

2

你是对的,延迟扩展必须(暂时)关闭才能正常工作。!必须转义(对于稍后延迟的部分)并引用处理其余部分:

@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命令仍然在没有延迟扩展的情况下被解析,但在之后执行endlocal(因为在执行任何操作之前解析了整行 - 是的,奇怪的事情......)

于 2020-04-22T06:49:14.687 回答