找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23266|回复: 12

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

[复制链接]
发表于 2022-10-20 20:37:42 | 显示全部楼层 |阅读模式
本帖最后由 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%=%
复制代码
感谢!
发表于 2022-10-21 09:03:45 | 显示全部楼层

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

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 乐于助人

查看全部评分

发表于 2022-10-21 09:17:47 | 显示全部楼层
刚开始学习,乱写的
  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
复制代码

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 乐于助人

查看全部评分

发表于 2022-10-21 09:28:52 | 显示全部楼层
回复 3# 77七


    path系统默认的环境变量,不要用它作为自定义变量。

评分

参与人数 2技术 +2 收起 理由
sanmaodo + 1 乐于助人
77七 + 1 谢谢大佬指点!学习了!

查看全部评分

 楼主| 发表于 2022-10-21 10:14:18 | 显示全部楼层
感谢大家的帮助!代码现在工作正常。
 楼主| 发表于 2022-10-21 14:28:15 | 显示全部楼层
回复 2# hfxiang

抱歉,又遇到一个小问题,
我需要把代码放在注册表里,所以要写成一行,但返回不正确,请问又办法解决吗?
  1. set full="D:\3m_script\tools\oscdimg.exe" && set "pd=D:\3m_script\tools" && call echo %full:%pd%=%
复制代码
奇怪,在cmd窗口测试时,代码执行第一次,返回是错误的,再执行一次,返回又正确了。
发表于 2022-10-21 15:00:18 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2022-10-21 15:03:15 | 显示全部楼层
回复 6# sanmaodo


   
多条set指令建议分行写(set/a逗号分隔的除外),这样的结果比较稳定,写在一行里,会有许多不确定性
发表于 2022-10-21 16:44:44 | 显示全部楼层
翻来覆去没搞懂你要啥?
要这个?
  1. @echo off&setlocal enabledelayedexpansion&for /f "delims=" %%a in ("D:\3m_script\tools\oscdimg.exe") do (echo.%%~nxa)
复制代码

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 乐于助人

查看全部评分

发表于 2022-10-21 16:48:34 | 显示全部楼层
回复 6# sanmaodo


    你写得百分号个数不对,请再观察2楼代码。
 楼主| 发表于 2022-10-21 17:57:06 | 显示全部楼层
本帖最后由 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  表示所选择文件的路径(不含文件名)
复制代码
感谢大家的帮助!我似乎把问题变的更复杂了
发表于 2022-10-21 20:15:29 | 显示全部楼层
回复 11# sanmaodo
  1. @="C:\\Windows\\System32\\cmd.exe /v /k set p=%1&echo !p:%W\\=!|clip&&"%1""
复制代码
试试

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 乐于助人

查看全部评分

 楼主| 发表于 2022-10-21 21:01:50 | 显示全部楼层
回复  sanmaodo 试试
WHY 发表于 2022-10-21 20:15

目标达成,完美了,感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 14:30 , Processed in 0.021856 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表