[批处教程]三.4 环境变量延迟扩展

BAT(batch)脚本必知必用之“延时环境变量扩充” 在给朋友写一个简单的切割pcap/pcapng数据包的BAT脚本时,碰到了SET /P VAR=且等待用户输入后,VAR变量却始终为空的问题。然后仔细看了下写的脚本,发现原来没有SETLOCAL enabledelayedexpansion和通过!引用变量。 阅读详情

[批处教程]三.4 环境变量延迟扩展

编程&命令 2009-08-08 23:42:01 阅读66 评论0   字号:大中小 订阅

环境变量延迟扩展

本文学习重点:

一,什么是延迟环境变量扩展?

二,批处理变量延迟详解

三,批处理延迟变量(通俗解释)

四,什么时候使用延迟变量?如何使用?

 

 

一,什么是延迟环境变量扩展?

原文稿地址:http://bbs.bathome.cn/thread-3083-1-1.html

      延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫变量扩展!

CMD在解释我们的命令的时候,首先会读取一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合它的要求.如果我们要在命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%号,如%name%.当CMD在读取我们的整条命令进行格式匹配的时候,就会发现name这个字符两边加了%号,就不会把它当作普通字符处理,而是会把它当作一个变量处理,变量名叫name!然后CMD就会找到变量名对应的值,用该值替换掉这个变量名字(name),(如果变量名不存在值,就返回空值).再将这个替换好并且匹配的命令执行!这个替换值的过程,就叫做变量扩展,说白了就是把变量的名字,用它的值给替换掉后执行!也就是批处理如何识别一个变量的过程.

(注意:这里只是变量的扩展的意思,不是延迟环境变量扩展,要理解延迟环境变量扩展,必须先理解什么是变量的扩展) 也就是批处理如何识别一个变量的过程.

例1,

@echo off

set var=teste

cho %var%

pause

 

CMD在读取到echo %var%这句命令后,就会进行匹配操作,它马上就发现var字符两边有%号,这时CMD就会把它当作一个变量处理,查看这个var变量名是不是有值,如果有就用该值把变量名var给替换掉,这里我们的var在上一条命令set var=test中,给var赋值为test,所以CMD会用test把%var%这个变量名替换掉,替换后的结果就为echo test了.这些步骤都是CMD进行匹配操作的步骤,匹配完后,他再执行echo test这条语句,这时我们的CMD中就会echo出一个test了.

什么是环境变量扩展知道了,那什么是延迟环境变量扩展呢?

     在理解环境变量扩展时,我们知道CMD在解释命令时,首先会把一条完整的命令进行读取,然后进行匹配操作,匹配时它会把命令里的变量用变量的值给替换掉,然后执行这个替换好的命令.问题就出在"一条完整的命令",在BAT中,IF FOR这样的命令都可以加括号,将一些命令嵌套在里面执行.这样的话对于一条可以加扩号嵌其他命令的命令,他的完整格式就是

for %%i in (....)这样一个整体.此时,如果我们如果在括号里面嵌入一些设置变量值的命令,就会出现问题了!

例2,

@echo off

for /l %%i in (1,1,5) do (

    set var=%%i

    echo %var%

)

执行后会显示5个空行的错误提示!为什么?根据我们上面说的知识来理解。

通过这两个例子,大家应该已经理解,如果只有环境变量扩展这个过程的话,如果我们在可以嵌套命令的命令中执行赋值操作时,会让我们的BAT出现给变量赋值的问题.那么这个时候"延迟环境变量扩展",这个概念就被提出来了

在批处理中,我们可以用setloacl enabledelayedexpansion 这个命令来启用"延迟环境变量扩展"

在我们启用了"延迟环境变量扩展"后,当CMD在解释含有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进行匹配操作,这样我们的赋值操作就会完成.并且在"延迟环境变量扩展"启用后,CMD会用!号来判断这是不是一个变量,如没启用来变量用%name%这样的格式判断,启用后就用!name!这样的格式判断了,这个符号我们需要注意!

例3,

@echo off

setlocal enabledelayedexpansion

set var=1

for /l %%i in (1,1,5) do (

    set /a var+=%%i

    echo !var!

)

pause

 

这样大家因该明白什么是延迟环境变量扩展了吧.再来一个例子

例4,

@echo off

set var=test & echo %test%

pause

 

这条命令放在一行,表示他是一条完整的命令,不启用"延迟环境变量扩展",就会出现上面的赋值错误!改成下这样就OK了:

@echo off

setlocal enabledelayedexpansion

set var=test & echo !var!

pause.

 

 

二,批处理变量延迟详解

原文稿地址:http://bbs.bathome.cn/thread-3083-1-1.html

 

关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽,而且有数个代码示例,应该不难理解。在此仅略作一些补充。
      
在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。
      
而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。
      
而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。
      
因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。
            
而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。
      
延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off(此处说法有误,应为 CMD /v:on——namejm 注),它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。(原贴详见:http://www.cn-dos.net/forum/viewthread.php?tid=28273)

 

上面是willsort写的帖子对于新手来说比较难理解。不过没关系,我们先分析一个例子,同样是引用willsort老大的。本例启用了变量延迟,是个正确的例子!

例1,

@echo off & setlocal EnableDelayedExpansion

for /f  "tokens=* delims=" %%i in ("Hello world.") do (

    set n=%%i

    set n=!n:ld.=t!

    set n=!n:o w= S!

    set n=!n:He=Wi!

    echo !n!

)

Pause

 

将上面代码保存为.bat双击执行后会显示“Will Sort”字符串,下面将讲解每个语句的意思:

 

1.@echo off & setlocal EnableDelayedExpansion

关闭命令回显,并启用变量延迟

 

2.for /f  "tokens=* delims=" %%i in ("Hello world.") do (  )

for命令及其参数的使用,请大家在论坛里搜索相关字眼。限于篇幅问题,这里不作讨论。如果此时你不明白它的意思,那么你就当它的作用是把字符串“Hello world.”赋值给%%i好了,当然这只是权宜之计,以后一定要学习for的使用!

 

3.set n=%%i

把%%i的值(即Hello world.)赋予给变量n,这个大家都知道吧

 

4.set n=!n:ld.=t!

这里要讲讲set替换字符的功能了。这个语句的意思是,先获取变量n的值(此时n的值是“Hello world.”),然后将字符“t”替换字符“ld.”,然后再将替换后的结果再次赋值给变量n(此时n的值变为“Hello wort”)。至于set替换字符的编写格式,大家可以在CMD键入“set/?”找到“%PATH:str1=str2%”这段有说明

 

5.set n=!n:o w= S!

意思和上句一样,只是替换和被替换的内容不同。它是将“ S”替换“o w”(注意S前面和w前面都有个空格),其实willsort老大是想证明set替换字符是支持句点和空格的(第4句“ld”后面有个.)。此时n的值为“Hell Sort”

 

6.set n=!n:He=Wi!

这句不用说了吧,执行完这句后n的值为“Will Sort”

 

7.echo !n!

显示变量n的值

 

需要注意的是,一旦启用了变量延迟,就要用!号把变量括起来,而不能用%号。

好了,每句的意思已经说完了,下面要讲本帖真正要讨论的变量延迟的问题。

这里又要引用Will Sort老大的说明:当CMD读取for语句时,其后用一对圆括号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。

 

而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。

 

总的来说是,在没有启用变量延迟的情况下,凡是在括号内(即do里面)的变量,在执行for语句之前,就已经被替换成for语句之前其它命令对该变量所赋予的值。这句话不懂没关系,下面再看一个例子,看完你就会明白。

例2,

@echo off

for /f  "tokens=* delims=" %%i in ("Hello world.") do (

set n=%%i

set n=%n:ld.=t%

set n=%n:o w= S%

    set n=%n:He=Wi%

    echo %n%

)

Pause

 

这和前面的例子差不多,只是所有!号都换成%号,这是个错误的例子。因为它没有启用变量延迟,也没有使用!号把变量括起来。我们看到它的执行结果是显示“ECHO 处于关闭状态”。

为什么会这样呢?原因是,在没有启用变量延迟的情况下,凡是在括号内(即do里面)的变量,在执行for语句之前,就已经被替换成for语句之前其它命令对该变量所赋予的值。

则是说在本例中的以下几句

set n=%%i

set n=%n:ld.=t%

set n=%n:o w= S%

set n=%n:He=Wi%

echo %n%

第一句能正常执行并达到它的目的,因为它只是单纯地将%%i的值赋予给变量n,所以没有任何问题。其它几句属这样情况:早在for语句执行前,CMD就急不切待地将这几句里面的所有变量n一同执行替换行为,替换为for之前,其它命令对n所设置的值,从而使n变成一个常量。但在本例中,for语句之前只有@echo off这句,并没有其它命令对n作过任何赋值行为,所以在for之前,变量n的值为空值。即是说,set n=%n:ld.=t% 这句里面的变量n,在CMD读取(注意是读取不是执行)完整个for语句后(这时还未轮到set执行自己的任务),就立刻被替换为一个空值,一个空值里面没有任何东西,所以就不存在一字符替换另一字符这种说法(没有东西怎么替换?)。最终到执行set n=%n:ld.=t%语句时,它只是获取一个空值,再给变量n赋予空值而已。其它几句也是一样原理。

所以,最后echo %n%的时候变量n还是个空值,而echo命令没有东西可以显示,就只有显示“ECHO 处于关闭状态”这句来说明自己的状态

通过这个例子的说明,相信大家已经知道变量延迟的作用吧!我们再回头来看看例1。

启用变量延迟后,在执行

set n=!n:ld.=t!

set n=!n:o w= S!

set n=!n:He=Wi!

echo !n!

这些语句前,它们里面的变量n不会马上被CMD替换(启用延迟后,CMD变得有耐性啦^_^),而未被替换的话,那么n就还是变量,而不是常量。等到执行set n=!n:ld.=t!等这几句时,变量n才被替换。这样每个set命令都能感知变量n的任何变化,从而作出正确的替换行为。这就是变量延迟啦!

 

不要以为只有for才要用变量延迟,下面这个例子同样需要

例3,这是个错误的例子

@echo off

set mm=girl&echo %mm%

pause

 

执行后依然显示“ECHO 处于关闭状态”。

原因是没有启用延迟,而且在set mm=girl&echo %mm%语句前没有其它命令对mm进行赋值。这时当CMD执行set mm=girl&echo %mm%语句前,就已经急不切待地把变量mm的值替换了,而又因为前面没给mm赋值,所以mm被替换为空值,变成常量。等到echo命令执行时,它其实是echo一个不会变化的常量,本例中即是空值。

有人会问,echo前面不是给mm赋值了吗?

这个就要关系到CMD解释命令的步骤,大家可以参详本帖开头willsort的帖子。

总的来说是,如果不启用变量延迟,在本例中,echo是不会理会也不会知道,它前面(指同一行语句)是否有其它命令给mm赋值。它只会从set mm=girl&echo %mm%这句以上的语句中获取它所要显示的变量的内容,也就是说,上一行或上几行的命令将mm设置成什么值,echo命令就显示什么值。

大家这样做就明白了:

 

@echo off

set mm=boy

set mm=girl&echo %mm%

pause

 

看看显示什么结果就知道了!

 

这样编写例3才正确:

@echo off&setlocal EnableDelayedExpansion

set mm=girl&echo !mm!

pause

 

开启了变量延迟,变量扩展(替换)的行为就推迟到echo命令执行时,这时echo能感知它前面的命令(本例的set)对变量mm做了什么“坏事”,从而作出正确的判断并执行

 

 

三,批处理延迟变量(通俗解释)

原文地址:http://bbs.bathome.cn/viewthread.php?tid=354

 

变量延迟  setlocal EnableDelayedExpansion

 

一个让大多数新手头痛的问题,网上教程虽多,但多半都是看不懂的,里面的专业术语太多。

以 cn-dos 联盟的willsort的这篇教程为例,(个人认为是解释的极具权威和专业的)

http://www.cn-dos.net/forum/viewthread.php?tid=20733

但可能就是因为专业,所以才看不懂,因为学cmd批处理的并不一定都是学计算机专业的。

这个鬼东西确实不太好理解,在下也是摸爬滚打多时,总结出一点点经验,现用通俗的方法

解释出来,希望能给新手些帮助,老鸟们见笑了,若有不对的地方,欢迎指出。

 

言归正传、

在什么时候需要延迟变量,和该如何引用延迟变量,我想这才是大多数新手迫切想要知道的问题。

耐心看完下面的内容,我想对你应该是有帮助的。

要想了解延迟变量,首先你要明白什么是“复合语句”好像又来了个“专业”名词,别急,这个超好理解。所谓“复合语句”就是指一对()里的所有命令。比如for的do后面

如:

for /f "delims=" %%i in (a.txt) do (

      set var=%%i

      echo %%i

      set num=%%i

)

 

这里do后面的三句命令,在一对()里面,这就叫“复合语句”,当然不止for 还有if 等等。。。

如:

if "%var%"=="abc" (

   echo ok

   set lis=123

)

 

反正就是凡是()里的所有命令,就叫“复合语句”

另外:这也是复合语句 set abc=123&echo %abc%

没错,通过管道命令&连接起来的命令,也是复合语句。

好,了解了复合语句,现在开始讲延迟变量,也就说,在复合语句中才要使用延迟变量。

我们先不去理解什么叫“变量的扩展”这玩意叫法太专业,我到现在都不太明白,

我们只要知道在什么时候需要使用延迟变量,如何才能正确提取到我们需要的变量就可以了,这才是我们的目的。

cmd在处理“复合语句”的时候,如果“复合语句”中用到了变量,会把变量的值当作复合语句之前变量的值来引用。如果在此之前变量没有被赋值,就把它当成空值。

例1,

@echo off

for /l %%i in (1 1 10) do (

    set var=%%i

    echo %var%

)

Pause

 

运行上面的代码,显示什么?显示10个echo处于关闭状态。按照逻辑,var的值应该依次是 1、2、3........10 才对啊!

 

这就是因为没有开启 延迟变量 的缘故,cmd把var的值当作复合语句之前的值来引用,

而在本例中,复合语句之前并没有给var定义,所以var的值是空的,所以会显示10个echo处于关闭状态。

例2,

@echo off

set var=abc

for /l %%i in (1 1 10) do (

    set var=%%i

    echo %var%

)

Pause

 

运行上面的代码,会显示什么,大家应该知道了吧?

例3,

@echo off

set var=abc

for /l %%i in (1 1 5) do (

    set var%%i=%%i

    echo %var%

)

echo %var1% %var2% %var3% %var4% %var5%

pause

 

运行上面的代码后,复合语句中所赋的值全部显示出来了,这说明什么呢?

说明,在复合语句中,并不是没有给变量赋值,只是你若没有开启延迟变量,

你就没法在复合语句中提取到它,要等复合语句运行完毕后,才能提取到。

变量的表示方法:两种:  1、%var%   2、!var!

第一种表示方法,大家都知道,第二种就是引用 延迟的变量。

在开启了延迟变量的情况下,如果在复合语句之外,用哪种方法表示都可以。

但是你若要在复合语句中引用复合语句即时得到的变量,就要用第二种方法。看例子

例4,

@echo off

setlocal EnableDelayedExpansion

set var=abc

for /l %%i in (1 1 10) do (

    set var=%%i

    echo %var%

    echo !var!

)

Pause

 

注意:例子中有两个echo 一个是显示 %var% 一个是显示 !var!

结果很明白了,%var% 显示的结果是复合语句之前变量var的值,

而 !var! 显示的就是复合语句中即时得到的值。

例5,

@echo off

setlocal EnableDelayedExpansion

for /l %%i in (1 1 5) do (

    set var%%i=%%i

)

echo %var1% %var2% %var3% %var4% %var5%

echo !var1! !var2! !var3! !var4! !var5!

pause

 

这个例子说明什么,不用再解释了吧?

说明在开启了延迟变量的情况下,且在复合语句之外,用两种方法都可以表示变量。

就说到这吧。以上的解释,完全是出于个人的理解,也是为方便非专业人士理解,

解释肯定有错误的地方、就象学习英语时,为方便记忆,用汉字的读音来作解释一样。

呵呵,是一种“偏门”各位新手千万不要把以上所说的当成是“真理”,否则就变成是“误人”了。

 

 

四,什么时候使用延迟变量?如何使用?

什么时候使用延迟变量?如何使用?这些一直是使新手困惑的地方,那到底是怎么样的呢?那请看下面的例子,我们将一步步引导大家。

例1,

@echo off

set /a num=0

for /l %%i in (1 1 3) do (

     Rem ================================

     set /a num+=1

     Rem 原意是变量num的值每次都加1

     Rem ================================

     echo %num%

)

pause>nul

 

先猜猜看,运行之后的结果是什么呢?你是不是认为它会显示:1 2 3 呢?我想大部分人会这么认为。你再将以上代码保存为批处理文件,运行,看看结果。

你会看到,显示的结果并不是意料中的 1 2 3 而是 0 0 0,这个是为什么呢?

 

原来这个是因为,批处理在处理for 或者if 语句中的变量时,先要进行预处理,把其中的用%%括起来的变量,先替换为语句之前的变量(如上面的代码,for语句中的%num%早就被替换为语句前的 值:0),所以,for语句运行时,虽然已经给变量加了1,但是,值却不变(因为echo %num%中的%num%早已被替换为:0了)。

 

那么,要实现(for或者if)语句中的变量实时的变化(如这里,我就要将1 2 3 显示出来)要怎么办呢?那就要起用延迟变量,先在批处理中申明:setlocal enabledelayedexpansion

然后,将语句:echo %num%改成!num!(也就是将“%”改成“!”),这样就可以达到效果了,演示代码:

例2,

@echo off

Rem ''''///////下面先申明起用延迟变量/////////////

setlocal enabledelayedexpansion

set /a num=0

for /l %%i in (1 1 3) do (

     Rem ================================

     set /a num+=1

     Rem 变量num的值每次都加1

     Rem ================================

     Rem '''''''//////////////////下面的变量不能再用"%"括起来,而应该用"!"////////////

     echo !num!

)

pause>nul

 

 

归纳总结:

1、为什么要用延迟变量?

让if语句和for语句中的变量实时变化;

2、什么时候用延迟变量?

一般是用在 for 语句和 if 语句中;

3、怎么用延迟变量?

先在批处理中申明起用延迟变量:setlocal enabledelayedexpansion

然后将 for 语句、if语句中的变量用两个"!"括起来即可

4、其实在使用变量嵌套变量也可以使用变量延迟的。

 

例3,

@echo off

set a=1

set b1=10

echo %b%a%%

pause

 

执行显示,得到 %b1%

 

其实我想得到的是 赋予b1的值,即 10  那么如何实现呢?将上例修改如下,

 

例4,

@echo off

set a=1&set b1=10

call,echo %%b%a%%%

pause>nul

 

call 这里实际是对命令行进行重新组织扩展,先扩展%%b%a%%%里面的%a%,使%a%变成a的值1,再用cal来扩展%b1%。

 

也可以用变量延迟来实现,方法如下:

 

例5,

@echo off

set /a a=1,b1=10

Setlocal EnableDelayedExpansion

echo:!b%a%! ...

pause

 

 

call 在这里的用法实际是变量延迟的一种快捷方式,变量延迟一般用在for的循环体里面。

call,%%b%a%%% 这里的逗号实际是一个分隔符,和空格一样,还有很多分隔符可用,比如上例中的 echo:!b%a%! ,当然并不是所有的命令都可以这样用,看情况而定……

 

 

引用:

C:/>echo+cn-dos.net

cn-dos.net

 

C:/>echo/cn-dos.net

cn-dos.net

 

C:/>echo[cn-dos.net

cn-dos.net

 

C:/>echo:cn-dos.net

cn-dos.net

 

C:/>echo;cn-dos.net

cn-dos.net

 

 

例6,
@echo off&setlocal enabledelayedexpansion

set a=1000

set b=dd

set a%b%=9000

set c=!a%b%!

echo %c%

pause

 

执行一下,看看显示的将是什么?为什么是这样?相信通过例4,例5你也能分析得出来吧?

 

 

注:以上文章在编辑整理时稍有修改!

janunapr 编辑于 2009-08-08 星期六 23:53   
【windows屏幕扩展】把你多余屏幕利用起来,spacedesk屏幕扩展超低延迟解决方案 目录 扫盲 扫盲 spacedesk是一款基于TCP/IP协议的屏幕扩展工具,通过这款工具你可以把自己身边的闲置的平板手机或者笔记本利用起来,扩展你的屏幕。只要你的两台设备处于同一个网络环境下(只要互相能够ping通),你就可以实现屏幕扩展(卡不卡我就不知道了)。 用过win10中的wifi扩展屏幕的同学都知道,扩展的屏幕显示质量和网络环境成正比。而win10的屏幕扩展很玄学,... 阅读详情

相关推荐

扩展RocketMQ 使其支持任意时间精度的消息延迟

前言 本想使用rocketmq的延迟消息特性,但延迟的范围有限,仅支持 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 这18个等级,之外的延迟时间不支持,本文是为了说明如何利用rocketmq的延迟消息实现任意时间的消息延迟,如何进行扩展的 技术架构 rocketmq部署 下载安装包 https://mirror.bit.edu.cn/apache/rocketmq/4.7.0/rocketmq-all-4.7

孟凡霄 4626

批处理命令 / 延迟环境变量扩展

@time 2019-07-09 @author Ruo_Xiao 1、变量扩展 当写一个 bat 脚本时,解释器会读取命令行完整指令,若解释器发现指令里面有变量时,需要对变量进行替换,那么识别变量的方法就是用“%”将变量括起来。替换之后,再进行指令的匹配操作,最后执行命令。 整体过程为: (1)读取完整指令。 (...

布袋和尚 1404

GStreamer学习三(延迟)

1、延迟 延迟(即latency)是在时间戳0处捕获的样本到达接收器所花费的时间。此时间是根据流水线的时钟测量的。对于只有包含与时钟同步的接收器元素的流水线,latency始终为0,因为没有其他元素延迟缓冲区。对于实时源的管道,必须引入延迟,这主要是因为实时源的工作方式。考虑一个音频源,它将在时间0开始捕获第一个采样。如果该源以44100Hz的频率一次推送具有44100个采样的缓冲区,由于缓冲区的时间戳为0,而现在是时钟的>= 1(单位:44100采样时间),接收器将丢弃此缓冲区。因为为时已晚,在接

cai742925624的专栏 4773

延迟环境变量扩展(变量延迟)

指的是:主动设置一个变量,然后在后续过程中使用该变量。在使用过程中,CMD进行变量扩展的一系列过程。当我们在bat命令中引用了一些变量,并且希望被CMD成功识别的时候,我们可以对变量添加。例2中的for循环,在CMD看来也就是一条语句,而不是代码段,其实类似于下面的写法。这样的输出结果说明,第一条语句并没有按预想的情况输出,而第二条按预想的情况输出了。当我们执行下列存在嵌套情况的语句时,CMD的环境变量扩展就会暴露出问题。,指的是:“对变量从变量名到变量值”的替换的过程。,这样一来,在脚本运行过程中,

好好学习,天天向上 1310

解决屏幕不亮难题:慷智SerDes DE信号极性配置避坑指南

本文深入探讨了基于慷智AIM95x系列SerDes芯片的嵌入式显示系统开发中,因DE信号极性配置不匹配导致屏幕不亮的典型故障。文章详细解析了DE信号的核心作用与极性定义,提供了慷智SerDes芯片中DE极性寄存器的具体配置方法与调试记录,并给出了从隔离问题、对比时序到波形验证的系统性排查流程,帮助工程师快速定位并解决此类隐蔽问题。

weixin_29185493的博客 141

关于获取CISP-PTE一些避坑经历

考场内是不允许携带外设键盘的,现场会至少有一个360安全专业人员监考.所有人电脑都会提前装一个奇安信的一个考试exe,刚开始的时候会让你连接一个WIFI,我们将会通过WIFI进行做题,做题期间你的电脑将被全程监控并且一些退出快捷键也是全部锁死(有点像勒索病毒那种界面),想要重启必须直接拔电源。中途可以上厕所,需要监考官陪同

6322

批处理之延迟环境变量扩展

所谓延迟变量扩展,实际上是指批处理运行命令时将变量扩展时机延迟到命令运行时,而不是加载时。@echo offset a=1if %a%==1 set a=2 & echo %a%pause输出结果为:1原因是在 if 语句开始正式运行之前,批处理脚本引擎已经将该条语句扩展为if 1==1 set a=2 & echo 1为了避免%a%被过早扩展,我们就可以引入延迟变量扩展机制@echo off & setlocal enabledelayedexpansionset a=1if %a%==1 set a=2

numenshane1的专栏 3691

从CTF到实战:Frida Hook无导出SO函数的3种特殊姿势

本文深入探讨了在移动安全逆向工程中,如何利用Frida Hook无导出SO函数的三种高级技巧:字符串引用定位法、调用栈回溯法和内存特征码扫描。针对安卓So层加固和混淆场景,文章结合CTF赛题与实战案例,详细解析了每种方法的原理、实现步骤与适用场景,为安全研究人员提供了从理论到实践的完整解决方案。

jenkins8butler的博客 516

延迟扩展和多普勒扩展

延迟扩展->多径传播->时域上:时间延迟;频域上:与宽的冲激响应进行卷积。希望这个解释帮助你更清晰地理解这两个概念!多普勒扩展->相对运动->频谱偏移。

qq_51011530的博客 1751

第一篇:常见CAN错误帧及其排查方向

在本文中主要阐述各类错误帧的形成原因以及在使用同星硬件设备出现错误帧时,应当 如何进行排查并消除错误帧。在 CAN 总线通信中,通常遇见的错误帧主要为以下五种,其 分别是:bit error、ACK error、stuff error、CRC error 以及 form error。

u013089100的博客 1745

当启动容器的时候提示:exec format error?如何解决问题

Docker容器出现"exec format error"的主要原因是架构不兼容(如ARM设备运行x86镜像)。解决方案包括:1)匹配镜像与宿主机架构;2)构建时指定平台;3)安装QEMU模拟器;4)修复文件权限和格式;5)验证基础镜像兼容性。排查流程应从检查架构匹配开始,逐步验证权限、解释器和换行符等问题。建议优先使用多架构镜像,构建时明确指定平台,并使用buildx工具生成多平台镜像。调试时可进入容器手动验证文件格式和兼容性。

weixin_39291964的博客 2719

【WINDOWS / DOS 批处理】变量扩展与变量延迟扩展

在WINDOWS / DOS 编程中,变量如何扩展?本文详细解析它的扩展过程,并介绍它们的用法。

【扬科网络官方技术博客】让每个勤奋者成为网络时代的精英 1062

层层剖析,让你彻底搞懂Self-Attention、MultiHead-Attention和Masked-Attention的机制和原理

本文内容 本文基于李宏毅老师对 Self-Attention 的讲解,进行理解和补充,并结合Pytorch代码,最终目的是使得自己和各位读者更好的理解Self-Attention 李宏毅Self-Attention链接: https://www.youtube.com/watch?v=hYdO9CscNes PPT链接见视频下方 通过本文的阅读,你可以获得以下知识: 什么是Self-Attention,为什么要用Self-Attention? Self-Attention是如何做的? Self-Atten

iioSnail的博客 2万+

[转载]批处理--环境变量延迟扩展

一,什么是延迟环境变量扩展? 原文稿地址:http://bbs.bathome.cn/thread-3083-1-1.html      延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫变量扩展! CMD在解释我们的命令的时候,首先会读取一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合它的要求.如果我们要在命令中引用一些变量,那么我

phoenix_lo的专栏 1061

RK3588开发笔记-5G模块(SIM8200、广和通FM160、移远RM500U)调试笔记

RK3588 CPU提供了丰富的外设接口,本文主要介绍通过usb3.0接口驱动5G模块来实现5g无线数据传输功能。在物联网和边缘计算领域,5G网络支持的高速率、低延时连接为应用带来了更多可能性。RK3588作为一款高性能SoC,适合用于5G联网应用。SIM8200广和通FM160和移远RM500U。在RK3588上调试5G模块可以为设备提供稳定的高速联网能力。本文介绍了如何配置和调试SIM8200、广和通FM160和移远RM500U模块,通过AT指令和QMI/MBIM工具实现5G数据连接。

flypig has a dream! 2670

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

延迟的环境变量扩展

要理解什么是“延迟的环境变量扩展”,首先要理解什么是“环境变量扩展”。 cmd在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输的命令格式是否正确。如果我们要在命令中引用一些变量,那么我们需要在变量的两边各加一个%号,使cmd在解释我们的命令的时候能够识别这个变量,例如%name%。当cmd读取我们的命令进行格式匹配的时候,就会发现name这...

weixin_34302798的博客 137

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

.bat批处理文件的延迟环境变量扩展的概念

延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求.   如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%号,如%name%.当CMD在对读取

after_you的博客 965

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

延迟环境变量扩展(bat)

延迟环境变量扩展(bat) 之前遇到一些环境变量的问题,简单记录下 From:http://www.cnblogs.com/dongzhiquan/archive/2012/09/05/2671218.html %var%相当于宏变量直接将值换到命令中,然后执行。 !var!则是普通变量,每次可以直接读取内存中的值。 延迟变量全称\"延迟环境变量扩展\",要理解这个东西,我们...

weixin_30779691的博客 343

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

dos中的延迟环境变量扩展

一、前言 昨天在写bat脚本的时候,发现在for里面的set命令竟然不起作用!于是搜了一下,前面的几篇都有说到这个是变量扩展的问题,但是什么是变量扩展?为什么会出现这种问题,什么又是延迟环境变量扩展?则说得不明不白。那些文章里给的解决方案,试过了一下甚至无法起作用。可怕的是那篇文章其他人还复制了。 还好今天搜了一下,看到一篇能真正说明并解决这个问题的,于是决定整理如下。 二、变量扩展 ...

weixin_30412167的博客 182

批处理-延迟环境变量扩展

  延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求.   如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%号,如%name%.当CMD在对读取...

weixin_34117522的博客 82

延迟扩展和相干带宽 VS 多普勒扩展和相干时间

现考虑一个线性时不变随机信道,信道响应为:h(t;) = h(), 信道输出 y(t) 与信道输入 x(t) 之间的关系如下:y(t) = (h*x) (t) . * 为卷积 如果在这种信道下,传输一个无穷窄的脉冲(类似一个 delta 输入),接收端的信道输出被扩展到秒,则我们说这种信道是时间弥散的,且延迟扩展为。 如果用来发射携带信息的一个脉冲持续时间为,同时,被传送符号的周期为,通过延迟扩展等于的信道 h() 传播后,接收到的符号波形的持续时间等于+。 ...

weixin_44186925的博客 3181

延迟环境变量扩展 setlocal enabledelayedexpansion的作用

延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展! CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求. 如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%号,如%name%...

weixin_33840661的博客 113
上一篇: [CMD] FOR命令中的变量
下一篇: WMIC的用法
dot_50
博客等级 码龄22年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值