我有一个批处理文件,它正在调用另一个批处理文件。批处理文件1是将5个参数解析为批处理文件2。
当我解析从批处理文件1到批处理文件2的参数时,它会正确地解析,但是当我分配这些解析的参数在批处理文件2中使用它们时,它会中断。
批处理文件1:
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:
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仍然以不同的方式破坏它。
发布于 2019-11-30 13:29:42
@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的工作原理都是一样的,所以我使用后者来说明原理。)
诀窍是确保使用空格(或其他有毒字符)的部件被正确引用。
可悲的是,这涉及到一些思考、数和尝试。我看不出有什么安全的方法来自动化这个(除了很多代码)。
对于这个特殊的字符串
SELECT MAX("Date") FROM SQ_TEST."Sample - Superstore Ran";字符串"%sql%"变成:
"SELECT MAX("Date") FROM SQ_TEST."Sample - Superstore Ran";"
SiiiiiiiiiiiEooooSiiiiiiiiiiiiiiiEoooooooooooooooooooooooSiE下面的行显示了字符串的一部分是inside还是outside的适当引用,以及Start和End的引文。
下一步是确保引用每个SPACE (或任何其他分隔符) (inside),在需要时添加引号(不是围绕空格本身,而是围绕包含它们的子字符串,使用已经存在的引号的位置)。
这会将字符串更改为:
"SELECT MAX("Date") FROM SQ_TEST.""Sample - Superstore Ran"";"
SiiiiiiiiiiiEooooSiiiiiiiiiiiiiiiESiiiiiiiiiiiiiiiiiiiiiiiESoE现在,每个空格都被正确引用(您可以看到,其他“不相关的”部分可能会改变它们的内部/外部状态,这是很困难的)。所以它可以作为一个参数传递。
当然,这意味着,在接收方有一些上流引号,必须删除。我们可以很容易地(至少在本例中)用"替换每个"来实现这一点。
set "var=%~1"
set "var=%var:""=%"注意:这是非常特定于要处理的字符串,所以我试着一步一步地解释要做什么。您将不得不重新考虑每个特定字符串的整个过程,我相信有一些组合,这种方法将是无用的。
https://stackoverflow.com/questions/59111562
复制相似问题