批处理脚本 - 无法显示特殊字符^

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

我需要有关批处理脚本的帮助,如下所示。

我得到了一个将字符串回显到 Java 程序的命令

setlocal DisableDelayedExpansion

set InputData=RAY5557

echo %InputData%| java %Java_scripts%Javaout_2.java

输出如下:

!为了雷(^5557^)!

我想设置输出,以便我可以使用输出将结果从命令“echo %InputData%| java %Java_scripts%Javaout_2.java”传递到另一个任务

我该怎么做?

如果我将输出设置为 tmp 并 echo %tmp%,则缺少 ^ 符号:

setlocal DisableDelayedExpansion

set InputData=RAY5557

for /f "delims="  %%G in ( '"echo %InputData%| java %Java_scripts%Javaout_2.java"') do (set tmp=%%G)

echo tmp: %tmp%

输出:

tmp:!为了雷(5557)!

我需要输出为

!为了雷(^5557^)!

batch-file
1个回答
0
投票

字符

^
Windows 命令处理器
cmd.exe
解释为双引号参数字符串外部的转义字符。

可以使用以下代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "InputData=RAY5557"
set "OutputData="
for /F delims^=^ eol^= %%G in ('"echo %InputData%| java.exe %Java_scripts%Javaout_2.java"') do set "OutputData=%%G"
setlocal EnableDelayedExpansion & echo OutputData: !OutputData!& endlocal
endlocal

delims^=^ eol^=
cmd.exe
解释为
delims= eol=
,它定义了一个空的分隔符列表并且没有行尾字符。这种特殊的语法是必要的,以避免捕获的输出既不使用普通空格和水平制表符作为分隔符分割成子字符串,也不忽略第一个子字符串上以分号开头的行。

不能使用

"delims= eol="
,因为这会导致定义空的分隔符列表,但
"
作为行尾字符。
"eol= delims="
会将空格字符定义为行尾字符和空分隔符列表。

水平制表符、普通空格、逗号、分号、等号和十进制代码点值为 255 的 OEM 编码不间断空格被解释为双引号参数字符串外部的参数字符串分隔符。这就是定义两个

for /F
选项的原因,通常没有周围的
"
转义两个等号以及将它们解释为文字字符而不是参数字符串分隔符的正常空间。

请阅读我的答案 Why is no string output with 'echo %var%' after using 'set var = text' on command line? 它详细解释了为什么语法

set "variable=value"
被强烈推荐(重新)环境变量的定义。捕获的输出数据完全分配给循环变量
G
,该变量用于使用之前明确未定义的输出数据定义环境变量
OutputData
。命令 SET 的整个参数字符串包含在
"
中,从而将输出数据中的
^
解释为文字字符。

重要的是,延迟扩展被禁用,否则在

set "OutputData=%%G"
被分配给循环变量的字符串替换后,
%%G
部分将被再次解析,这将导致任何感叹号被解释为开始/延迟扩展变量引用的末尾导致最终分配给环境变量的字符串值发生不必要的修改
OutputData

分配给环境变量

OutputData
的字符串输出(不使用周围的
"
)(命令 ECHO 也会输出),需要启用延迟变量扩展以防止首先用字符串替换变量引用
%OutputData%
分配给环境变量的值并将下一个
^
解释为转义字符。另请参阅:Windows 命令解释器 (CMD.EXE) 如何解析脚本?

也可以仅使用

set OutputData
而不是
setlocal EnableDelayedExpansion & echo OutputData: !OutputData!& endlocal
来输出名称以
OutputData
开头(不区分大小写)的所有环境变量,其中包含名称、等号以及已定义的此类环境变量的指定值.

注意:FOR /F 分别

cmd.exe
处理批处理文件在这种情况下会在后台使用
cmd.exe
以及
FOR /F
命令行的
%ComSpec% /c
内的命令行再运行一次 ' 作为附加论据。在这里了解这一点很重要,因为这意味着整个
for /F
命令行必须对两个
cmd.exe
具有有效语法 - 一个处理批处理文件,另一个在后台启动,执行命令行并将其输出到句柄 STDOUT(标准输出)由
cmd.exe
处理批处理文件捕获,并使用附加执行的 FOR 循环进行处理
cmd.exe
在完成命令行执行后最终自行关闭。

没有显示环境变量

Java_scripts
是如何由真实的批处理文件定义的。如果变量
Java_scripts
的字符串值包含空格或这些字符
&(){}^=;!'+,`~
之一,则发布的代码可能不起作用。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • cmd /?
  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?

我建议还阅读:

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