Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在变量(%var1%var2%%)中获取变量_Variables_Batch File_Set - Fatal编程技术网

Variables 如何在变量(%var1%var2%%)中获取变量

Variables 如何在变量(%var1%var2%%)中获取变量,variables,batch-file,set,Variables,Batch File,Set,我试图获取用户输入的字符串,然后让文本滚动 到目前为止,我所拥有的: @echo off setlocal set /p myString=String: cls call :StringLenght result myString :ECHO set /a result=%result%-1 set myString=%mystring:~%result%% echo %myString% ping -n 2 localhost>nul cls :StringLenght <r

我试图获取用户输入的字符串,然后让文本滚动

到目前为止,我所拥有的:

@echo off
setlocal
set /p myString=String:
cls

call :StringLenght result myString
:ECHO
set /a result=%result%-1
set myString=%mystring:~%result%%
echo %myString%
ping -n 2 localhost>nul
cls

:StringLenght <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    goto ECHO
)

当我在变量%%中时,我无法从变量中提取字符串(听起来很奇怪,但我想你可以想象我的意思)。

你需要延迟扩展才能工作

这是一个概念:

@echo off
setlocal EnableDelayedExpansion

set "mystring=mousetail"
set result=5
echo %mystring%
echo !mystring:~%result%!

应该很容易在代码中实现。

您需要延迟扩展才能工作

这是一个概念:

@echo off
setlocal EnableDelayedExpansion

set "mystring=mousetail"
set result=5
echo %mystring%
echo !mystring:~%result%!

应该很容易在代码中实现。

一种没有延迟扩展的替代方法是使用
调用
命令,如下所示:

@echo off

set "myString=something"
set "result=4"
echo %myString%
call echo %%myString:~%result%%%
发生的情况是,
Result
的扩展立即完成,但
myString
的扩展被执行到由
call
打开的新
cmd
实例:

  • 首先,将
    echo
    之后的
    %%
    替换为单个
    %%
  • 其次,
    %result%
    被展开,即被其值
    4
    替换
  • 第三,最后一个
    %%
    被一个
    %%
    替换
  • 最后,将命令行
    echo%myString:~4%
    传递给
    call
    打开的新
    cmd
    实例,从而显示
    thing
请注意,这仅在批处理文件中有效,而不直接在命令提示符(
cmd
)中有效


如果两个嵌套变量都需要延迟展开,可以使用
for
循环:

@echo off

set "myString=something"
set "result=4"
setlocal EnableDelayedExpansion
echo !myString!
for %%I in (!Result!) do echo !myString:~%%I!
endlocal

这是因为
变量
%%I的
在应用延迟扩展之前已展开,因此循环体将接收命令行
echo!我的故事:~4

一种不延迟扩展的替代方法是使用
调用
命令,如下所示:

@echo off

set "myString=something"
set "result=4"
echo %myString%
call echo %%myString:~%result%%%
发生的情况是,
Result
的扩展立即完成,但
myString
的扩展被执行到由
call
打开的新
cmd
实例:

  • 首先,将
    echo
    之后的
    %%
    替换为单个
    %%
  • 其次,
    %result%
    被展开,即被其值
    4
    替换
  • 第三,最后一个
    %%
    被一个
    %%
    替换
  • 最后,将命令行
    echo%myString:~4%
    传递给
    call
    打开的新
    cmd
    实例,从而显示
    thing
请注意,这仅在批处理文件中有效,而不直接在命令提示符(
cmd
)中有效


如果两个嵌套变量都需要延迟展开,可以使用
for
循环:

@echo off

set "myString=something"
set "result=4"
setlocal EnableDelayedExpansion
echo !myString!
for %%I in (!Result!) do echo !myString:~%%I!
endlocal

这是因为
变量
%%I的
在应用延迟扩展之前已展开,因此循环体将接收命令行
echo!我的故事:~4

所以我不需要“endlocal”?-感谢为我编写的代码:)endlocal在批处理文件结束时隐式完成。您可以给它一个
endlocal
,但实际上并不需要它。(除了在批处理文件期间必须打开和关闭它-有时,你必须这样做)。所以我不需要“endlocal”?-感谢为我编写的代码:)endlocal在批处理文件结束时隐式完成。您可以给它一个
endlocal
,但实际上并不需要它。(除非在批处理文件期间必须打开和关闭它-有时,您必须这样做)。