jjzjj

windows - 批量替换 !-sign

coder 2024-06-08 原文

我正在尝试删除变量中的字符 !

setlocal enableextensions enabledelayedexpansion 
set filename=!filename:!=_! 

我已经尝试使用 ^ 对其进行转义,但这没有用。

Set filename=!filename:^!=_!

我怎样才能去掉变量中的 !-sign?

最佳答案

您不能替换 %使用正常扩展时。您必须使用延迟扩展 insntead:!var:%%=_!

同样,您不能替换 !使用延迟扩展时。您必须改用普通扩展:%var:!=_% .

但是如果您的变量可能包含像 ^ 这样的有害字符的混合物,这可能会成为一个问题。 , & , | , > , <以及引号。例如,没有单步方法可以替换 !在以下字符串中:"This & that" & the other thing!

诀窍是分阶段进行替换,主要使用延迟扩展,使用正常扩展进行替换。

1) 延迟扩展 - 转换 "进入""

2) 正常扩展-转换!进入replacement .因为所有引号都加倍了,所以现在可以保证扩展周围的外部引号保护所有有毒字符

3) 延迟扩展 - 转换 """

@echo off
setlocal enableDelayedExpansion
set "var="This ^& that" & the other thing^!"
echo before: !var!

set "var=!var:"=""!"
set "var=%var:!=_%"
set "var=!var:""="!"

echo  after: !var!

-- 输出--

before: "This & that" & the other thing!
 after: "This & that" & the other thing_

但是你正在处理文件名,这可以使问题更简单:-)

文件名可以包含毒字符&^ , 但它们不能包含引号。您可以在文件名(或路径)中的任何位置放置引号,它们将保护有毒字符。但是当操作系统在磁盘上存储或查找文件时,引号会被操作系统删除。

所以我通常会确保我的文件名和路径变量不包含引号。然后简单地使用是安全的:

set "filename=%filename:!=_%"

糟糕 - 我现在才看了问题评论,发现这是一个循环!

替换发生在循环内这一事实使事情变得复杂,因为正常扩展将看不到循环内定义的值。

请注意,扩展 FOR 变量时必须关闭延迟扩展,否则会损坏 !在文件名中。

最简单的解决方案是使用 CALL 来获得额外一轮的扩展:

@echo off
setlocal disableDelayedExpansion
for %%F in (*) do (
  set "file=%%F"
  call set "file=%%file:!=_%%"
  setlocal enableDelayedExpansion
  echo file=!file!
  endlocal
)

如果您正在进行其他需要延迟扩展的操作,那么 !将需要在正常扩展替换表达式中转义,因为延迟扩展发生在 CALL 之前。 (感谢杰布)。

这是一个消除 ^ 的例子和 &

@echo off
setlocal disableDelayedExpansion
for %%F in (*) do (
  set "file=%%F"
  setlocal enableDelayedExpansion
  set "file=!file:^=_!"
  set "file=!file:&= and !"
  call set "file=%%file:^!=_%%"
  echo file=!file!
  endlocal
)

虽然我可以简单地启用延迟扩展之后我已经删除了! .那么就不需要转义了。

关于windows - 批量替换 !-sign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828500/

有关windows - 批量替换 !-sign的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  8. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  9. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  10. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

随机推荐