Windows 批处理文件中的传递、转义和识别特殊字符

2023-12-01

我编写了一个脚本,它会遍历输入字符串的每个字符,并根据我需要执行不同操作的字符。只要我的输入不包含任何空格或双引号字符,这种方法就可以很好地工作。我知道我必须转义特殊字符,但由于某种原因,我似乎对空格和双引号做错了。

如果我使用参数“ab cd”运行批处理,a 和 b 会被正确处理,然后脚本会在空白处停止并显示错误消息:“(此时 SET 是意外的)”。这似乎是指:

ECHO char: %char%
if %char%==0 (SET file=0.wav)

之前没有抛出过这个错误。但将 %char% 设置为空白时,这一行似乎有问题。显示一切如何协同工作的方案是:

控制台输入: myScript.bat "ab cd" -> mytext = "ab cd" -> (loop) char = "a" ->char = "b" -> char = " " -> "(SET 在此是意外的时间)”。

请参阅下面代码的更完整版本(无循环)。

:: get input (allow quoted inputs like "ab cd")
SET mytext=%~1

:: get first character from input
SET char=%mytext:~0,1%


:: works fine
if %char%==1 (...do something...)
if %char%==2 (...do something...)    
if %char%==a (...do something...)
if %char%==b (...do something...)

::..also special characters work fine (some need escape sequence)
if %char%==^( (...do something...)
if %char%==^) (...do something...)
if %char%==: (...do something...)
if %char%==- (...do something...)
if %char%==+ (...do something...)
if %char%==$ (...do something...)
if %char%==. (...do something...)
if %char%==^! (...do something...)
if %char%==^' (...do something...)

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Value to test
    set "myText=1 <> () & !"" "

:loop    
    rem Quote it to avoid problems with special characters.
    rem Closing quote is not included in value
    SET "char=%mytext:~0,1%"

    rem Test if we have something to test
    if not defined char goto :done

    rem Test first problematic characters that need escape
    if ^%char%==^" echo quote           & goto :next
    if ^%char%==^& echo ampersand       & goto :next
    if ^%char%==^> echo greater than    & goto :next
    if ^%char%==^< echo lower than      & goto :next
    if ^%char%==^^ echo caret           & goto :next
    if ^%char%==^( echo open bracket    & goto :next
    if ^%char%==^) echo close bracket   & goto :next

    %= ... =%

    rem Test for spaces 
    if "%char%"==" " echo space         & goto :next

    rem Test the rest of the options
    if %char%==1 echo one               & goto :next
    if %char%==! echo exclamation       & goto :next

    %= ... =%

    rem Once done, go to next character

:next
    set "myText=%myText:~1%"
    if defined myText goto :loop

:done
    exit /b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 批处理文件中的传递、转义和识别特殊字符 的相关文章

  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • 正则表达式库基准

    我最近一直想知道正则表达式实现的性能 并且很难想出很多有用的信息 它很容易对浏览器 javascript 正则表达式性能进行基准测试 网上有很多工具 Chrome 和 Opera 中的 javascript 正则表达式实现几乎摧毁了所有其他
  • 如何使用正则表达式在 Java 中检查确切的电话号码

    你好 我是正则表达式的新手 我不知道我在做什么 这就是我寻求帮助的原因 我有以下电话号码 359878123456 我需要检查该电话号码是否符合条件 359 是准确的扩展名 第二个 2 个数字是操作员号码和以下 3 个数字之一 87 88
  • 如何使正则表达式匹配不区分大小写?

    我有以下正则表达式加拿大的邮政编码 http en wikipedia org wiki Postal codes in Canada ABCEGHJKLMNPRSTVXY 1 d 1 A Z 1 d 1 A Z 1 d 1 它工作正常 但
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • 使用正则表达式模式查找 -name 并使用 cp 替换文件名

    目前我正在使用该命令cron复制 data从源到目标路径 find source path name data exec cp target path 源码结构为 source path category1 001 data source
  • 批处理脚本 - IF EXIST 复制到 %localappdata% 错误

    我似乎被批处理脚本困住了 需要一些帮助 基本上我需要检查文件是否存在于文件夹中 localappdata 如果确实如此 则覆盖该文件 如果没有放置在不同的位置 那么目前它的内容如下 IF EXIST localappdata foldern
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 如何将 Hudson/Jenkins 参数传递给 Windows 批处理命令

    好吧 我需要在我的 Hudson 作业中执行一个批处理文件 我有一个参数 Jenkis 参数 我需要将这个值 如参数 传递给批处理文件 我尝试了以下操作 Deploy cmd configuration DEPLOYCONFIGURATIO
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • RegularExpressionValidator 限制输入长度而不限制字符类型

    我正在尝试使用RegularExpressionValidator验证一个TextBox输入长度 我可以使用它 但它只接受字母和数字 我想允许any个字符 唯一的检查是不超过 25 个字符
  • Bash 正则表达式——似乎无法匹配任何 \s \S \d \D \w \W 等

    我有一个脚本试图从 gparted 获取信息块 我的数据如下所示 Disk dev sda 42 9GB Sector size logical physical 512B 512B Partition Table msdos Number
  • 验证 Salesforce ID

    有没有办法验证 Salesforce ID 也许使用 RegEx 它们通常是 15 个字符或 18 个字符 但它们是否遵循我们可以用来检查它是否是有效 ID 的模式 验证 salesforce ID 有两个级别 使用正则表达式检查格式 a
  • grep 的贪婪行为

    我认为在正则表达式中 贪婪 适用于量词而不是整个匹配 然而 我观察到 grep E color auto a ab lt printf aab returns aab而不是aab 这同样适用于 sed 另一方面 在 pcregrep 和其他
  • 使用正则表达式定位响铃字符

    我注意到 Bell 有一个正则表达式字符 我却无法匹配 我读到了这个角色的内容维基百科 http en wikipedia org wiki Bell character 但我不明白如何在正则表达式中找到它
  • PHP 电子邮件验证[重复]

    这个问题在这里已经有答案了 For PHP最好的电子邮件验证方法是什么preg NOT ereg因为它是已弃用 删除 I don t需要检查该网站是否存在 这不像最高安全性 我找到了很多方法ereg但它们 显然 不是好的做法 我建议你使用F
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则

随机推荐