批量使用参数和变量中的特殊字符,而无需使用外部文件

时间:2018-10-16 15:38:32

标签: string batch-file escaping

在您将其标记为重复项之前,请听我说

我的问题;

A:与所有其他要求有不同的要求(基本上是“什么是转义符?”),其中包括:不必使用外部文件为函数输入参数

B:质疑这种混乱的存在,而不是接受“否”或“其复杂性”作为答案

C:了解已经存在转义字符,并且解决该问题的方法

D:来自不同的技能水平,不是2-7岁的问题

E:要求使用引号而不是[之类的东西,因为引号是唯一适用于间隔字符串的东西

还在你说我没尝试过东西之前 我读了这些(所有这些都包括评论等):

Batch character escaping

http://www.robvanderwoude.com/escapechars.php

https://blogs.msdn.microsoft.com/oldnewthing/20091029-00/?p=16213

using batch echo with special characters

Escape angle brackets in a Windows command prompt

Pass, escape and recognize Special Character in Windows Batch File

我不完全理解所有这些,因为要完全理解所有这些,我必须在批处理方面做得更好,但这是我收集到的内容:

因此,我了解到有一整个转义表,^是最常用的转义表,您可以使用延迟扩展来执行此任务,这样就不会立即解析字符,只是在运行时“扩展”,但是启用延迟扩展功能并不总是有效,因为使用管道字符时,通过管道传输到/从管道传输的其他文件/内容不会继承扩展状态,因此

A:您也必须在那里启用

B:迫使您使用该扩展名

C:CLI的每个解析过程都需要多个转义字符,这显然很难确定并且很难看。

这一切看起来都非常荒谬,为什么没有某种创建方式来设置一串奇数输入来代替文字而不是处理字符。为什么这不是在某些超级duper特殊字符(如alt字符)上的简单标记,除非将字体设置为wingdings,否则几乎不会出现。为什么每个管道字符解析过程都删除转义字符?这只会使一切疯狂,因为用户现在必须知道该字符串被使用了多少次。为什么没有开发一种可以自动扫描奇数输入并自动转义它们的工具?我们有一个规则表,真的那么难吗?已经完成了吗?它需要什么“硬”?

沿着兔子洞走

您是怎么问我到这里的?好了,这一切都始于我做一个简单的修边功能,然后遇到了批处理中最大的问题之一,即在接收输入时转义了字符。问题是我对微调功能的很多输入都带有引号。使用“”代替“”可以使引号转义,例如

::SETUP
::parenthesis is just to deliniate where it goes, it isn't 
::actually in 
::the code
set "var=(stuff goes here)"
call :TrimFunc "%var%",var

:TrimFunc
::the + are just to display the spacing otherwise I can't tell
echo beginning param1 is +%~1+
::code goes here for func
gotoEOF

::END SETUP

::NOTE the + characters aren't part of the actual value, just the 
::display when I run this function

set "var=""a"""

::got +"a"+

将起作用,但是

set "var="a " 

::got +"a+

::expected +"a +

set "var="a ""

::got +"a+

::expected +"a "+

set "var="a " "

::got +"a+

::expected +"a " +

set "var="a"

::got +"a",var+

::expected +"a+

将无法正常工作。奇怪的是,

set "var="a""

::got +"a"+

尽管没有完全逃脱,但似乎仍能正常工作。添加任何空格似乎都会破坏这种极端情况。

奇怪的是我已经尝试过:

set 'var="a"'

::got ++

::expected +"a"+

但是我不知道,当将'改为'时,实际上将其更改为包含自变量的参数(而不是应为文字的参数)。

看看会发生什么,并且

我想要什么:

当然必须有某种通用转义字符,这样我才能做到这一点(假设特殊字符为*)

set *var=""something " "" " """*
call :TrimFunc "%var%",var
echo +%~1+

可以让我了解

+""something " "" " """+

没有问题。实际上,为什么我不能拥有一些通用转义字符,而这些字符只能从字面上接受所有其他字符,而不是在命令行中尝试处理它们?也许我在想这个错误,但这似乎是一个反复出现的问题,到处都是奇怪的输入。我只希望我的vairbales,烟斗和琴弦以及所有这些东西在应有的情况下保持原样。我只希望有一种输入方式,而没有任何怪异的输出方式,它应该从字面上对待所有内容,直到我不想要为止,因为它被我心中发明的神秘的超级特殊字符所包围。

::noob rant

我不明白为什么这从来都不是问题。是什么阻止了这种非常有用的语言的创建者仅仅创建一个标志和一个从未用作过高转义字符的字符。为什么我们需要像10种不同的转义字符方式?如有必要,我应该能够以编程方式对输入进行转义,这绝非用户的工作来转义其输入,那绝对是荒谬的,并且可能违反了现有的所有良好编码标准

::END noob rant

无论如何。我很高兴能对上述为什么是一件事感到启发。我只想能够在一个STRING中使用引号(很重要),而且我不明白为什么它不像拥有一个巨大的“按文字处理这些东西”那样简单,总是标有 Just Works (Tm值)。

顺便说一句,万一您想知道为什么我的函数为什么要使用要写入的变量的名称,我不知道如何在不使用延迟扩展的情况下使标签内部的标签正常工作。使用它意味着我正在创建的变量是局部的而不是全局的,因此我使用全局变量的名称将返回值(使用其名称)基本上设置为局部值,如下所示:

endlocal & set "%~2=%String%"

随意对我大喊大叫,因为我99%肯定我在做语法上非常错误的事情,有一些错误的误解,或者只是天真地真正理解这个问题的复杂性的方法,但在我看来令人惊讶地多余。

为什么不能像使用特殊字符那样使用最后一个引号,但是所有前面的引号都是按字面意义使用的(可能取决于标志)

例如

设置“ var =“ a””

为什么后两个引号不是特别起作用,而中间的两个引号实际上是起作用的? CLI不能告知行的结尾吗?它不能分辨出第一引号和最后引号之间的区别吗?对我来说,这似乎很简单。

只要我能正确地回应事物并将它们的字面值从参数保存到变量中,我就很高兴。

1 个答案:

答案 0 :(得分:0)

首先,我不太了解您为什么要使用set "var=something"而不是set var=something,这似乎没有什么区别。

第二,希望有帮助,我(最近是IDK。)发明了一种处理烦人的报价的方法。希望这一批可以激发或帮助您做类似的事情。

@echo off
title check for length of string
color de
mode con: cols=90 lines=25
goto t

:t
set str=error
set /p str=Please enter four characters: 
set len=0
goto sl

:sl
call set this=%%str:~%len%%%
if not "%this%" == "" (set /a len+=1 & rem debug" == "" (set /a len+=1
goto sl)
if not "%len%" == "4" (set n= not) else (set n=)
echo This is%n% a four character string.
pause >nul
exit

在您的情况下:

if not "%var%" == "" (call :TrimFunc "%var%",var & rem debug" == "" (call :TrimFunc "%var%,var)
) 

希望有帮助。加油〜(我的计算机由于未知原因不支持延迟扩展。因此,大多数代码都有些笨拙。)


P.S .:如果您只是删除文本而不是替换文本,为什么不使用set var=%var:string=%?如果所需的字符串也是变量,则可以尝试以下操作:call set var=%%var:%string%=%%