标题: [文本处理] 批处理echo不用引号怎样显示一个包含&内容的字符串? [打印本页]
作者: wqte45 时间: 2024-2-20 17:33 标题: 批处理echo不用引号怎样显示一个包含&内容的字符串?
比如 好多文件名里包含&字符,获取到文件名后,用echo来显示 会被截断成两条命令
可以用 echo "%~1" 来显示出来,但看上去不美观,上下文有的没引号,突然多出来一行引号的不美观
有什么方法 不用双引号就能echo的吗?(包括cmd能解析的其他符号 &&等)
或者有替代echo 来显示字符串的吗?
作者: aloha20200628 时间: 2024-2-20 17:53
echo,"%~1" 换成 set/p="%~1"<nul
作者: wqte45 时间: 2024-2-20 22:33
本帖最后由 wqte45 于 2024-2-20 22:46 编辑
echo,"%~1" 换成 set/p="%~1"
aloha20200628 发表于 2024-2-20 17:53
1,用你的方法 set/p="%~1"<nul 即使参数手动加上“” 输出内容也不显示引号了,可以实现。就是代码有点多,而且它不会自动换行,还要手动加一句echo.- C:\Users\MEN>C:\Users\MEN\Desktop\q.bat "C:\Users\MEN\Desktop\1&2.c"
- 100% complete
-
- file : C:\Users\MEN\Desktop\1&2.c
- crc32 : FF3E3007
- rename: 1&2 FF3E3007.c
- 请按任意键继续. . .
复制代码
---------------------------------------------------------------------------------------------
2,用echo,"%~1" 参数有引号的时候,会显示引号,不美观- D:\Hash & Rename\2>"Hash&Ren3.bat" "C:\Users\MEN\Desktop\1&2.c"
- 100% complete
-
- file : "C:\Users\MEN\Desktop\1&2.c"
- crc32 : FF3E3007
- rename: "1&2 FF3E3007.c"
-
- 等待 0 秒,按一个键继续 ...
复制代码
---------------------------------------------------------------------------------------------
疑问:
像第一种方法那样输出的"%1"包含&的参数内容 不带引号的方法 所有版本的windows都支持吗?
还有更简单的方法吗?
作者: Five66 时间: 2024-2-20 23:54
除了要ehco显示出/?本身 必须带引号外
其他大部分特殊字符可以扔进for里
或者扔进变量里然后enabledelayedexpansion
如果只是文件名的话,可以用
for %%z in ("%~1") do echo,%%~z
前提是传递到bat里的%1准确
如果是文本字符串的话,基本上没啥通用并准确的方法了,
特别是还有echo命令对于/?那坑爹的解析规则
作者: ShowCode 时间: 2024-2-21 08:56
回复 3# wqte45
像第一种方法那样输出的"%1"包含&的参数内容 不带引号的方法 所有版本的windows都支持吗?
是的,都支持。
作者: wqte45 时间: 2024-2-21 10:51
本帖最后由 wqte45 于 2024-2-21 11:10 编辑
回复 4# Five66
你说的用for %%z in ("%~1") do echo,%%~z 我试了是可以实现输出不带双引号
但是只要字符串里包含问号,就不会显示这个字符串,单独echo ? 都显示。
放循环里不显示了,比如 abcdefg? 显示不了这个字符串,但是包含/字符的字符串就可以正常显示,好在文件名也不让用?这个符号- C:\Users\MEN\Desktop\1&2&&3%1%2^6,,~~~~ 15AD3216 15AD3216 15AD3216.c
- 请按任意键继续. . .
复制代码
你说的延迟变量也可以实现吗?怎么用的?
作者: aloha20200628 时间: 2024-2-21 12:44
本帖最后由 aloha20200628 于 2024-2-21 13:00 编辑
1. set/p="%~1"<nul
2. set/p="%~1"<nul&echo,
3. for %%v in ("%~1") do echo,%%~v
在能够保全%1所含特殊字符这一前提下的单行输出比较结果》
句式1提供了一种可以不断行输出的方法
句式2强制断行输出
句式3强制断行输出且代码量更多,但多行输出时有明显优势
在纯P工具箱内尚未见第三种能够向标准设备输出字符串的方法...
作者: wqte45 时间: 2024-2-21 12:51
回复 7# aloha20200628
如果要多次输出 每条for 都用 %%v变量 名字一样 没关系吧
作者: aloha20200628 时间: 2024-2-21 12:57
回复 8# wqte45
亦可如此》for %%v in ("str1" "str2" "str3") do echo,%%~v
作者: wqte45 时间: 2024-2-21 15:45
本帖最后由 wqte45 于 2024-2-21 15:51 编辑
回复 wqte45
亦可如此》for %%v in ("str1" "str2" "str3") do echo,%%~v
aloha20200628 发表于 2024-2-21 12:57
本来代码都写了好几个了,其实每一个都能用,但是看完你们的回复,我又又想改了,改了好几个版本了,越改越长 :lol :lol
上一次这样写的- @echo off
- setlocal
- for /f "skip=3 delims=" %%i in ('crc32 "%~1"') do set str=%%i
- if "%str:~-8%"=="cified." (echo File does not exist & goto exit)
- for %%z in ("file : %~1") do echo %%~z
- echo crc32 : %str:~-8%
- for %%z in ("rename: %~n1 %str:~-8%%~x1") do echo %%~z
- ren "%~1" "%~n1 %str:~-8%%~x1"
- :exit
- endlocal & timeout /t 3 & exit/b
复制代码
现在又改了:lol- @echo off
- for /f "skip=3 delims=" %%i in ('crc32 "%~1"') do set str=%%i
- if "%str:~-8%"=="cified." (echo File does not exist & goto exit)
- for %%z in ("file : %~1" "crc32 : %str:~-8%" "rename: %~n1 %str:~-8%%~x1") do echo %%~z
- ren "%~1" "%~n1 %str:~-8%%~x1"
- :exit
- timeout /t 3 & exit/b
复制代码
输出结果:- D:\Hash & Rename\2>"Hash&Ren3.bat" "C:\Users\MEN\Desktop\1&6,1&&6.txt"
- 100% complete
-
- file : C:\Users\MEN\Desktop\1&6,1&&6.txt
- crc32 : 18526A77
- rename: 1&6,1&&6 18526A77.txt
-
- 等待 0 秒,按一个键继续 ...
复制代码
话说setlocal 和endlocal重要吗?
另外set/p="%~1"<nul好像就没办法 像你这样 里面放三个字符串了吧?
作者: aloha20200628 时间: 2024-2-21 18:07
回复 10# wqte45
批处理中setlocal与endlocal怎么用?》http://www.bathome.net/thread-1372-1-1.html
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |