[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理echo不用引号怎样显示一个包含&内容的字符串?

比如 好多文件名里包含&字符,获取到文件名后,用echo来显示 会被截断成两条命令
可以用 echo "%~1" 来显示出来,但看上去不美观,上下文有的没引号,突然多出来一行引号的不美观
有什么方法 不用双引号就能echo的吗?(包括cmd能解析的其他符号 &&等)
或者有替代echo 来显示字符串的吗?


echo,"%~1" 换成 set/p="%~1"<nul

TOP

本帖最后由 wqte45 于 2024-2-20 22:46 编辑
echo,"%~1" 换成 set/p="%~1"
aloha20200628 发表于 2024-2-20 17:53


1,用你的方法 set/p="%~1"<nul 即使参数手动加上“” 输出内容也不显示引号了,可以实现。就是代码有点多,而且它不会自动换行,还要手动加一句echo.
  1. C:\Users\MEN>C:\Users\MEN\Desktop\q.bat "C:\Users\MEN\Desktop\1&2.c"
  2. 100% complete
  3. file  : C:\Users\MEN\Desktop\1&2.c
  4. crc32 : FF3E3007
  5. rename: 1&2 FF3E3007.c
  6. 请按任意键继续. . .
复制代码
---------------------------------------------------------------------------------------------   
2,用echo,"%~1" 参数有引号的时候,会显示引号,不美观
  1. D:\Hash & Rename\2>"Hash&Ren3.bat" "C:\Users\MEN\Desktop\1&2.c"
  2. 100% complete
  3. file  : "C:\Users\MEN\Desktop\1&2.c"
  4. crc32 : FF3E3007
  5. rename: "1&2 FF3E3007.c"
  6. 等待 0 秒,按一个键继续 ...
复制代码
---------------------------------------------------------------------------------------------
疑问:
像第一种方法那样输出的"%1"包含&的参数内容 不带引号的方法 所有版本的windows都支持吗?
还有更简单的方法吗?

TOP

除了要ehco显示出/?本身  必须带引号外
其他大部分特殊字符可以扔进for里
或者扔进变量里然后enabledelayedexpansion

如果只是文件名的话,可以用
for %%z in ("%~1") do echo,%%~z
前提是传递到bat里的%1准确

如果是文本字符串的话,基本上没啥通用并准确的方法了,
特别是还有echo命令对于/?那坑爹的解析规则

TOP

回复 3# wqte45


像第一种方法那样输出的"%1"包含&的参数内容 不带引号的方法 所有版本的windows都支持吗?

是的,都支持。
测试代码之前请做好备份

TOP

本帖最后由 wqte45 于 2024-2-21 11:10 编辑

回复 4# Five66

    你说的用for %%z in ("%~1") do echo,%%~z 我试了是可以实现输出不带双引号
但是只要字符串里包含问号,就不会显示这个字符串,单独echo ? 都显示。
放循环里不显示了,比如 abcdefg?  显示不了这个字符串,但是包含/字符的字符串就可以正常显示,好在文件名也不让用?这个符号
  1. C:\Users\MEN\Desktop\1&2&&3%1%2^6,,~~~~ 15AD3216 15AD3216 15AD3216.c
  2. 请按任意键继续. . .
复制代码
你说的延迟变量也可以实现吗?怎么用的?

TOP

本帖最后由 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工具箱内尚未见第三种能够向标准设备输出字符串的方法...

TOP

回复 7# aloha20200628


    如果要多次输出 每条for 都用 %%v变量  名字一样  没关系吧

TOP

回复 8# wqte45

亦可如此》for %%v in ("str1" "str2" "str3") do echo,%%~v

TOP

本帖最后由 wqte45 于 2024-2-21 15:51 编辑
回复  wqte45

亦可如此》for %%v in ("str1" "str2" "str3") do echo,%%~v
aloha20200628 发表于 2024-2-21 12:57



本来代码都写了好几个了,其实每一个都能用,但是看完你们的回复,我又又想改了,改了好几个版本了,越改越长 :lol :lol
上一次这样写的
  1. @echo off
  2. setlocal
  3. for /f "skip=3 delims=" %%i in ('crc32 "%~1"') do set str=%%i
  4. if "%str:~-8%"=="cified." (echo File does not exist & goto exit)
  5. for %%z in ("file  : %~1") do echo %%~z
  6. echo crc32 : %str:~-8%
  7. for %%z in ("rename: %~n1 %str:~-8%%~x1") do echo %%~z
  8. ren "%~1" "%~n1 %str:~-8%%~x1"
  9. :exit
  10. endlocal & timeout /t 3 & exit/b
复制代码
现在又改了:lol
  1. @echo off
  2. for /f "skip=3 delims=" %%i in ('crc32 "%~1"') do set str=%%i
  3. if "%str:~-8%"=="cified." (echo File does not exist & goto exit)
  4. for %%z in ("file  : %~1" "crc32 : %str:~-8%" "rename: %~n1 %str:~-8%%~x1") do echo %%~z
  5. ren "%~1" "%~n1 %str:~-8%%~x1"
  6. :exit
  7. timeout /t 3 & exit/b
复制代码
输出结果:
  1. D:\Hash & Rename\2>"Hash&Ren3.bat" "C:\Users\MEN\Desktop\1&6,1&&6.txt"
  2. 100% complete
  3. file  : C:\Users\MEN\Desktop\1&6,1&&6.txt
  4. crc32 : 18526A77
  5. rename: 1&6,1&&6 18526A77.txt
  6. 等待 0 秒,按一个键继续 ...
复制代码
话说setlocal 和endlocal重要吗?
另外set/p="%~1"<nul好像就没办法 像你这样 里面放三个字符串了吧?

TOP

回复 10# wqte45
批处理中setlocal与endlocal怎么用?》http://www.bathome.net/thread-1372-1-1.html

TOP

返回列表