Board logo

标题: [文本处理] 请问批处理如何在字符串替换表达式中,引用变量?[已解决] [打印本页]

作者: sanmaodo    时间: 2022-10-20 20:37     标题: 请问批处理如何在字符串替换表达式中,引用变量?[已解决]

本帖最后由 sanmaodo 于 2022-10-21 14:05 编辑

我知道下面的代码是可行的,将得到 ”111.txt“
  1. set full="d:\aaa\111.txt"
  2. echo %full:d:\aaa\=%
复制代码
我的问题是,如何用变量来替代第二行中的 ”d:\aaa\“
像下的代码,不会正确返回,请问要如何修改?
  1. set full="d:\aaa\111.txt"
  2. set path="d:\aaa"
  3. set path=%path%\
  4. echo %full:%path%=%
复制代码
感谢!
作者: hfxiang    时间: 2022-10-21 09:03

  1. set full="d:\aaa\111.txt"
  2. set "dp=d:\aaa\"
  3. call echo %%full:%dp%=%%
复制代码

作者: 77七    时间: 2022-10-21 09:17

刚开始学习,乱写的
  1. @echo off & setlocal enabledelayedexpansion
  2. set "full=d:\aaa\111.txt"
  3. set "path=d:\aaa"
  4. set "path=%path%\"
  5. set "full=!full:%path%=!"
  6. echo %full%
  7. pause
复制代码

作者: Batcher    时间: 2022-10-21 09:28

回复 3# 77七


    path系统默认的环境变量,不要用它作为自定义变量。
作者: sanmaodo    时间: 2022-10-21 10:14

感谢大家的帮助!代码现在工作正常。
作者: sanmaodo    时间: 2022-10-21 14:28

回复 2# hfxiang

抱歉,又遇到一个小问题,
我需要把代码放在注册表里,所以要写成一行,但返回不正确,请问又办法解决吗?
  1. set full="D:\3m_script\tools\oscdimg.exe" && set "pd=D:\3m_script\tools\" && call echo %full:%pd%=%
复制代码
奇怪,在cmd窗口测试时,代码执行第一次,返回是错误的,再执行一次,返回又正确了。
作者: holley    时间: 2022-10-21 15:00

本帖最后由 holley 于 2022-10-21 15:02 编辑

回复 1# sanmaodo
  1. @echo off
  2. set full="d:\aaa\111.txt"
  3. echo %full:d:\aaa\=%
  4. call :print %full%
  5. :print
  6. set fn=%~nx1
  7. echo %fn%
  8. set fp=%~dp1
  9. echo %fp%
  10. pause
复制代码

作者: hfxiang    时间: 2022-10-21 15:03

回复 6# sanmaodo


   
多条set指令建议分行写(set/a逗号分隔的除外),这样的结果比较稳定,写在一行里,会有许多不确定性
作者: holley    时间: 2022-10-21 16:44

翻来覆去没搞懂你要啥?
要这个?
  1. @echo off&setlocal enabledelayedexpansion&for /f "delims=" %%a in ("D:\3m_script\tools\oscdimg.exe") do (echo.%%~nxa)
复制代码

作者: Batcher    时间: 2022-10-21 16:48

回复 6# sanmaodo


    你写得百分号个数不对,请再观察2楼代码。
作者: sanmaodo    时间: 2022-10-21 17:57

本帖最后由 sanmaodo 于 2022-10-21 18:03 编辑

回复 9# holley
这是一个资源管理器里针对exe文件的右键菜单项,用cmd窗口运行exe程序,同时把exe的全路径复制到剪贴板备用,
下面的代码能正常工作:
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\SystemFileAssociations\.exe\shell\Item0]
  3. "MUIVerb"="用 cmd 打开"
  4. "Icon"="C:\\Windows\\System32\\cmd.exe ,0"
  5. [HKEY_CLASSES_ROOT\SystemFileAssociations\.exe\shell\Item0\command]
  6. @="C:\\Windows\\System32\\cmd.exe /k echo %1 | clip && \"%1\""
复制代码
但我真正想要复制的是exe的文件名,所以发帖提问。
但下面的代码没有达到目标,它依旧返回全路径。
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\SystemFileAssociations\.exe\shell\Item0]
  3. "MUIVerb"="用 cmd 打开"
  4. "Icon"="C:\\Windows\\System32\\cmd.exe ,0"
  5. [HKEY_CLASSES_ROOT\SystemFileAssociations\.exe\shell\Item0\command]
  6. @="C:\\Windows\\System32\\cmd.exe /k \"%1\" && set "full=%1" && set "pd=%W" && call echo %%full:%dp%=%%"
  7. ; %1  表示所选择文件的全路径
  8. ; %W  表示所选择文件的路径(不含文件名)
复制代码
感谢大家的帮助!我似乎把问题变的更复杂了
作者: WHY    时间: 2022-10-21 20:15

回复 11# sanmaodo
  1. @="C:\\Windows\\System32\\cmd.exe /v /k set p=%1&echo !p:%W\\=!|clip&&\"%1\""
复制代码
试试
作者: sanmaodo    时间: 2022-10-21 21:01

回复  sanmaodo 试试
WHY 发表于 2022-10-21 20:15

目标达成,完美了,感谢!!




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