首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法操作来自另一个批处理文件的解析字符串,因为有空格并引号破坏它。

无法操作来自另一个批处理文件的解析字符串,因为有空格并引号破坏它。
EN

Stack Overflow用户
提问于 2019-11-29 22:21:58
回答 1查看 153关注 0票数 1

我有一个批处理文件,它正在调用另一个批处理文件。批处理文件1是将5个参数解析为批处理文件2。

当我解析从批处理文件1到批处理文件2的参数时,它会正确地解析,但是当我分配这些解析的参数在批处理文件2中使用它们时,它会中断。

批处理文件1:

代码语言:javascript
复制
ECHO
SET sql=SELECT MAX("Date") FROM SQ_TEST."Sample - Superstore Ran";
SET pref=W
SET num=0
SET day=Friday
SET config=SampleSuperStore.txt
CALL Z:\XXX\RunTableauRefreshAutomatic.bat %sql% %pref% %num% %day% %config%

批处理文件2:

代码语言:javascript
复制
CALL C:\XXX\anaconda3\Scripts\activate.bat 
SET sql=%~1
SET pref=%~2
SET num=%~3
SET day=%~4
SET config=%~5
C:\XXX\anaconda3\python.exe Z:\XXX\pMainAutomaticDB.py %sql% %pref% %num% %day% %config%
PAUSE

批处理文件2的响应:

Z:\XXX>CALL C:\XXX\anaconda3\Scripts\activate.bat

(基地) Z:\XXX>SET sql=SELECT

(基) Z:\XXX>SET pref=MAX(“日期”)

(基地) Z:\XXX>SET num=FROM

(基地) Z:\XXX>SET day=SQ_TEST.“样品-超级商店运行”

(基地) Z:\XXX>SET config=W

(底部) Z:\XXX>C:\XXX\anaconda3\python.exe Z:\XXX\pMainAutomaticDB.py从DL_SQ_TEST中选择MAX("Date")。

(底部) Z:\XXX>PAUSE按任意键继续。。。

更新:当我删除sql中的双引号时,它正常工作,但我需要它们。此外,我尝试使用^,但是批处理文件2仍然以不同的方式破坏它。

EN

回答 1

Stack Overflow用户

发布于 2019-11-30 13:29:42

代码语言:javascript
复制
@echo off
setlocal
SET "sql=SELECT MAX("Date") FROM SQ_TEST.""Sample - Superstore Ran"";"
call :otherbatch "%sql%" two three
goto :eof

:otherbatch
@echo off
set "var=%~1"
set "var=%var:""="%"
echo one :%var%
echo two :%~2
echo thre:%~3
goto :eof

(无论是单独的批处理文件还是子例程,call的工作原理都是一样的,所以我使用后者来说明原理。)

诀窍是确保使用空格(或其他有毒字符)的部件被正确引用。

可悲的是,这涉及到一些思考、数和尝试。我看不出有什么安全的方法来自动化这个(除了很多代码)。

对于这个特殊的字符串

代码语言:javascript
复制
SELECT MAX("Date") FROM SQ_TEST."Sample - Superstore Ran";

字符串"%sql%"变成:

代码语言:javascript
复制
"SELECT MAX("Date") FROM SQ_TEST."Sample - Superstore Ran";"
SiiiiiiiiiiiEooooSiiiiiiiiiiiiiiiEoooooooooooooooooooooooSiE

下面的行显示了字符串的一部分是inside还是outside的适当引用,以及Start和End的引文。

下一步是确保引用每个SPACE (或任何其他分隔符) (inside),在需要时添加引号(不是围绕空格本身,而是围绕包含它们的子字符串,使用已经存在的引号的位置)。

这会将字符串更改为:

代码语言:javascript
复制
"SELECT MAX("Date") FROM SQ_TEST.""Sample - Superstore Ran"";"
SiiiiiiiiiiiEooooSiiiiiiiiiiiiiiiESiiiiiiiiiiiiiiiiiiiiiiiESoE

现在,每个空格都被正确引用(您可以看到,其他“不相关的”部分可能会改变它们的内部/外部状态,这是很困难的)。所以它可以作为一个参数传递。

当然,这意味着,在接收方有一些上流引号,必须删除。我们可以很容易地(至少在本例中)用"替换每个"来实现这一点。

代码语言:javascript
复制
 set "var=%~1"
 set "var=%var:""=%"

注意:这是非常特定于要处理的字符串,所以我试着一步一步地解释要做什么。您将不得不重新考虑每个特定字符串的整个过程,我相信有一些组合,这种方法将是无用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59111562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档