Batch file CMD:在变量中设置/扩展变量的管道回显
Batch file CMD:在变量中设置/扩展变量的管道回显,batch-file,command-line,cmd,command-prompt,piping,Batch File,Command Line,Cmd,Command Prompt,Piping,%x:~12,3%返回从x变量中第12个字符开始的3个字符。 我一直试图实现的是使用变量,而不是12和3。 比如说y=12和z=3。 然后,您不能使用%x:~%y%,%z%%,因为CMD会认为%x:~%是一个变量 您可以做的是设置变量=%%x:~%y%,%z%%。这将扩展内部变量y和z,而不是x,因此var的值为%x:~12,3%。 现在剩下的任务是最终扩展%x:~12,3%。我一直在尝试在开始时附加echo,以便var=echo%x:~12,3%。 如果您现在在命令行或批处理文件中使用%var
%x:~12,3%
返回从x变量中第12个字符开始的3个字符。
我一直试图实现的是使用变量,而不是12
和3
。
比如说y=12
和z=3
。
然后,您不能使用%x:~%y%,%z%%
,因为CMD会认为%x:~%
是一个变量
您可以做的是设置变量=%%x:~%y%,%z%%
。这将扩展内部变量y
和z
,而不是x
,因此var
的值为%x:~12,3%
。
现在剩下的任务是最终扩展%x:~12,3%
。我一直在尝试在开始时附加echo
,以便var=echo%x:~12,3%
。
如果您现在在命令行或批处理文件中使用%var%
,则应执行echo命令,并展开后续表达式,但事实并非如此,echo%x:~12,3%
只会将%x:~12,3%
打印到屏幕上,不展开
我在想,如果您将var设置为%x:~12,3%
,那么可能会回显它
然后将输出传输到另一个ECHO
命令或SET
命令中,表达式将被展开,但ECHO
和SET
似乎根本不接受数据被传输到其中
我如何才能做到这一点?您需要启用延迟扩展
@echo off
setlocal enabledelayedexpansion
set string=1234567890abcdef
set substring_start=12
set substring_length=3
set substring=!string:~%substring_start%, %substring_length%!
set command=echo !substring!
!command!
pause
您需要启用延迟扩展
@echo off
setlocal enabledelayedexpansion
set string=1234567890abcdef
set substring_start=12
set substring_length=3
set substring=!string:~%substring_start%, %substring_length%!
set command=echo !substring!
!command!
pause
@ECHO关闭
SETLOCAL
设置“x=abcdefghijklmmopqrstuvwxyz”
设置/a开始=12
设置/a长度=3
调用集“var=%%x:~%start%,%length%%”
回音变量=%var%
调用echo%%x:~%start%,%length%%
SETLOCAL ENABLEDELAYEDEXPANSION
设置/a开始=6
设置/a长度=4
设置“var=!x:~%start%,%length%!”
回音变量=%var%
回声!x:~%start%,%length%!
后藤:EOF
有两种方法-第一种是在标准模式下,第二种是使用delayedexpansion
。关于延迟扩展的例子有数百个。@ECHO OFF
@echo off
setlocal enabledelayedexpansion
set string=1234567890abcdef
set substring_start=12
set substring_length=3
set substring=!string:~%substring_start%, %substring_length%!
set command=echo !substring!
!command!
pause
SETLOCAL
设置“x=abcdefghijklmmopqrstuvwxyz”
设置/a开始=12
设置/a长度=3
调用集“var=%%x:~%start%,%length%%”
回音变量=%var%
调用echo%%x:~%start%,%length%%
SETLOCAL ENABLEDELAYEDEXPANSION
设置/a开始=6
设置/a长度=4
设置“var=!x:~%start%,%length%!”
回音变量=%var%
回声!x:~%start%,%length%!
后藤:EOF
有两种方法-第一种是在标准模式下,第二种是使用
delayedexpansion
。关于delayedexpansion的例子有数百个。我复制了下面的全文;我只是更改了变量和特定示例的名称,以匹配此问题的名称:
@echo off
setlocal enabledelayedexpansion
set string=1234567890abcdef
set substring_start=12
set substring_length=3
set substring=!string:~%substring_start%, %substring_length%!
set command=echo !substring!
!command!
pause
%x:~12,3%
返回从x中第12个字符开始的3个字符
变量我一直试图实现的是使用变量
而不是12
和3
。比如说y=12
和z=3
如果您想为子字符串位置和长度使用另一个变量,那么您必须知道用其值替换包含在百分比中的变量是从左到右解析的;这意味着:
%x:~%y%,%z%%
不会给出所需的结果,因为这意味着:显示x:~
变量的值,后跟y
,后跟,
变量的值,等等
要解决此问题,必须使用延迟展开,即在开头插入setlocal EnableDelayedExpansion
命令,用百分比括起子字符串变量,用感叹号括起原始变量:
setlocal EnableDelayedExpansion
set x=0123456789ABCDEF
set y=12
set z=3
set var=!x:~%y%,%z%!
您还可以使用FOR命令的参数作为索引:FOR/F“tokens=1,2”%%i in(“%y%%z%”)do set var=!x:~%%i,%%j代码>
若要在/IF的内部索引更改时获取子字符串的值,请将变量括在两个百分比中,并在命令前面加上call
。例如,要在0和12之间的随机y
位置以及长度z
显示子字符串:
if %some% == %test% (
set /A y=!random! %% 13
call echo %%x:~!y!,%z%%%
)
也可以在括号外使用此方法,以避免延迟展开:
call echo %%x:~%y%,%z%%%
实现前面过程的另一种方法是使用额外的FOR命令,通过等效的可替换参数更改索引的延迟扩展,然后对原始变量使用延迟扩展。此方法的运行速度比上一次调用快:
if %some% == %test% (
set /A y=!random! %% 13
for %%y in (!y!) do echo !x:~%%y,%z%!
)
我复制了下面的全文;我只是更改了变量和特定示例的名称,以匹配此问题的名称:
%x:~12,3%
返回从x中第12个字符开始的3个字符
变量我一直试图实现的是使用变量
而不是12
和3
。比如说y=12
和z=3
如果您想为子字符串位置和长度使用另一个变量,那么您必须知道用其值替换包含在百分比中的变量是从左到右解析的;这意味着:%x:~%y%,%z%%
不会给出所需的结果,因为这意味着:显示x:~
变量的值,后跟y
,后跟,
变量的值,等等
要解决此问题,必须使用延迟展开,即在开头插入setlocal EnableDelayedExpansion
命令,用百分比括起子字符串变量,用感叹号括起原始变量:
setlocal EnableDelayedExpansion
set x=0123456789ABCDEF
set y=12
set z=3
set var=!x:~%y%,%z%!
您还可以使用FOR命令的参数作为索引:FOR/F“tokens=1,2”%%i in(“%y%%z%”)do set var=!x:~%%i,%%j代码>
若要在/IF的内部索引更改时获取子字符串的值,请将变量括在两个百分比中,并在命令前面加上call
。例如,要在0和12之间的随机y
位置以及长度z
显示子字符串:
if %some% == %test% (
set /A y=!random! %% 13
call echo %%x:~!y!,%z%%%
)
也可以在括号外使用此方法,以避免延迟展开:
call echo %%x:~%y%,%z%%%
实现上一个过程的另一种方法