Board logo

标题: [其他] set var=:变量替换的问题 [打印本页]

作者: freesoft00    时间: 2017-1-20 10:35     标题: set var=:变量替换的问题

本帖最后由 freesoft00 于 2017-1-20 11:50 编辑
  1. @echo off
  2. set var=:
  3. set /p "var=input"
  4. set "var=%var:"=%"
  5. echo %var%
  6. pause
复制代码
这个是路径获取的批处理,拖拽或者手动输入路径。请帮忙解释一下,为什么前要有一个set var=:
set "var=%var:"=%"这个是要去除双引号吗?可是我测试双引号还在呀。
论坛应该有这个问题的讨论,现在怎么也搜索不到帖子为什么要加这个了。
谢谢!
作者: GNU    时间: 2017-1-20 11:29

有可能是代码的作者写错了呢
作者: WHY    时间: 2017-1-20 11:48

回复 1# freesoft00


     把3,4行互换应该可以删除引号,但路径中含特殊字符(如&)时可能报错。
把第2行删掉,输入时再直接回车,试试效果。
作者: freesoft00    时间: 2017-1-20 11:49

回复 2# GNU


    应该不是吧,这个帖子主要搜索不到了。忘记是为了应对什么情况了。

另外,这里:
http://www.bathome.net/thread-4580-1-6.html
  1. call set "str=%%str:*:=%%"
复制代码
这一句也没有明天是什么意思。
虽然下面有解释
delims=: 会把行首的所有冒号抛弃,所以,使用了 call set "str=%%str:*:=%%" 语句来避免这种情况;

但是还是没有明白这个是截取替换的什么*:
作者: freesoft00    时间: 2017-1-20 11:50

本帖最后由 freesoft00 于 2017-1-20 11:56 编辑

回复 3# WHY


    确实是我写错了,把3行4行改回来了。
把第2行删掉,输入有引号的路径,也可以去除引号。那么第二行还有什么意义呢
作者: GNU    时间: 2017-1-20 11:59

回复 4# freesoft00


不考虑文本中的感叹号的话,下面两种写法作用相同:
call set "str=%%str:*:=%%"
set "str=!str:*:=!"

星号在字符串替换中的作用:

    %PATH:str1=str2%

would expand the PATH environment variable, substituting each occurrence
of "str1" in the expanded result with "str2".  "str2" can be the empty
string to effectively delete all occurrences of "str1" from the expanded
output.  "str1" can begin with an asterisk, in which case it will match
everything from the beginning of the expanded output to the first
occurrence of the remaining portion of str1.

作者: GNU    时间: 2017-1-20 12:00

回复 5# freesoft00


    第二行的作用是:变量初始化
作者: freesoft00    时间: 2017-1-20 12:08

本帖最后由 freesoft00 于 2017-1-20 12:17 编辑

回复 7# GNU


    初始化不能是set var=吗,为什么要加一个:号呢



set "str=!str:*:=!"
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
兄弟是否可以具体举一个例子
作者: freesoft00    时间: 2017-1-20 12:26

本帖最后由 freesoft00 于 2017-1-20 12:29 编辑

好像明白set "str=!str:*:=!"了,是不是下面

1:"aou"eo
2:
3:;euou%^>
4:::::aeui
5:   
6::::E2uo alejou 3<o2io|
7:^aue||%ou
8:
9:!aue!
10:aoue eou 2
11:!str!auoeu!ueo &&
12:euo 8
13:ueyi^^^^aueuo2
14:~ ! @ # $ % ^ & * ( () " ok " No " <>nul
15:set ok=^

从文本行的开始到第一个:都替换为空

应该理解错了,又测试了
  1. sdfalsdf:www
  2. sdflkjkjljlkj:88
复制代码
发现:号前面的并没有消失 。
作者: GNU    时间: 2017-1-20 13:17

回复 9# freesoft00


不知道你怎么测试的
C:\>set str=sdfalsdf:www
C:\>set str=%str:*:=%
C:\>echo %str%
www
作者: freesoft00    时间: 2017-1-20 14:06

本帖最后由 freesoft00 于 2017-1-20 14:10 编辑

回复 10# GNU


    那么可能是我刚才的代码有问题了。说明一开始理解的是对的。


看到jm的chm反编译的帖子中也有类似的
  1. set str=%*
  2. set "str=%str:"=%"
  3. set "str= %str%"
复制代码
而一楼的是
  1. set var=:
  2. set /p "var=input"
  3. set "var=%var:"=%"
  4. echo %var%
复制代码
set str=%*和set var=:有什么区别,为什么一开始要设置一下。
作者: GNU    时间: 2017-1-20 15:06

回复 11# freesoft00


    %*表示所有的位置参数,因为那个代码要处理多个chm文件




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2