我想将当前批处理文件路径传递给sql文件,该文件将由sqlplus调用并将结果假脱机到该路径中。我的代码如下。它在假脱机线路上失败,因为路径没有用双引号传递。你能帮我吗
启动sqlplus%DBUName%/%DBPwd%@%GISName%“@%~dp0SQL \ SetUp \ SETUP.sql”“%~dp0Config \ SETUP.ok”
在设置sql中,我给出了以下行
SPOOL& 1
答案 0 :(得分:2)
快速猜测:
start "" sqlplus....
现在好了!有一个有趣的练习。
start "" sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"
是start
的“引用参数”问题的标准解决方案。第一个"quoted string"
被指定为窗口的标题 - 这就是正常的投诉。插入明显多余的空字符串不会为窗口提供标题 - 它实际上是“这是我想要的窗口标题”的最简单形式 - 并且更容易输入。
我没有时间以任何方式测试这个,这就是为什么我把它作为猜测。我尝试使用名为sqlplus.bat
的批处理文件,它只显示其参数:
@echo off
setlocal
echo @~nx0 received ==^>%*^<==
pause
exit
但这似乎可以按预期提供所有论据。
因为sqlplus
是可执行文件,我以为我会安装它并尝试。呃 - 33Mb min,以及所有legalese登录和密码以及另一个我只会使用一次的帐户...... Na。
所以我在Delphi中构建了自己的sqlplus.exe
- 简单地评估命令行参数。三十秒的工作。
问题是我无法使用声称按位置返回参数的函数让可执行文件在参数中显示引号。所以那个我不得不调查。我发现了一个函数来返回所提供的整个命令行 - 并且有引号,大如生命。
原来有一个Delphi错误,其中paramstr(x)
从参数x返回的值中删除了封闭引号。向EMBT报道。
使用我构建的可执行文件重新测试 - 显示命令行本身(cmdline
,如果你感兴趣的话) - 以及 - 在这个问题的上下文中的坏消息 - 我的测试显示该
start sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"
和
start "" sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"
都提供相同的命令行 - 包括所写的引号。
所以 - 似乎问题出在sqlplus
或指令sqlplus
执行。引用的字符串似乎可以很好地传递给可执行文件。
假设OP执行
sqlplus%DBUName%/%DBPwd%@%GISName%“@%~dp0SQL \ SetUp \ SETUP.sql”“%~dp0Config \ SETUP.ok”
(在替换适当的参数之后) - 这是否按预期显示报价? (这个问题实际上是SQLPLUS
问题和此标记的偏离主题。我不知道sqlplus
。
附加(嗯,真的是评论,但它不适合评论系统......)我相信我们遇到了语言或终端问题......
确实
sqlplus%DBUName%/%DBPwd%@%GISName%“@%~dp0SQL \ SetUp \ SETUP.sql”“%~dp0Config \ SETUP.ok”
当使用完全相同的语法执行时(但用%dbuName%
等替换为实际名称)直接从命令提示符执行时是否正确运行?
答案 1 :(得分:0)
我不确定,你需要什么。您是否需要更多引号或否引号。任何-
你可以拥有任意数量的报价。我没有sqlplus
,但它并不那么重要。我可以用'calc.exe`来证明这一点:
我认为,这不是cmd / Batch问题。它属于您的sqlplus
。
@ECHO OFF &SETLOCAL
title Test of Quotes
set dbuname=dbuname
set DBPwd=DBPwd
set gisname=gisname
start calc %dbuname%/%DBPwd%@%gisname% @%~dp0SQL\SetUp\SETUP.sql %~dp0Config\SETUP.ok
start calc %dbuname%/%DBPwd%@%gisname% @%~dp0SQL\SetUp\SETUP.sql "%~dp0Config\SETUP.ok"
start calc %dbuname%/%DBPwd%@%gisname% "@%~dp0SQL\SetUp\SETUP.sql" %~dp0Config\SETUP.ok
start calc %dbuname%/%DBPwd%@%gisname% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"
start calc %dbuname%/%DBPwd%@%gisname% "@%~dp0SQL\SetUp\SETUP.sql" ""%~dp0Config\SETUP.ok""
start calc %dbuname%/%DBPwd%@%gisname% ""@%~dp0SQL\SetUp\SETUP.sql"" ""%~dp0Config\SETUP.ok""
start calc %dbuname%/%DBPwd%@%gisname% """@%~dp0SQL\SetUp\SETUP.sql""" ""%~dp0Config\SETUP.ok""
start calc %dbuname%/%DBPwd%@%gisname% """@%~dp0SQL\SetUp\SETUP.sql""" """%~dp0Config\SETUP.ok"""
ping -n 3 localhost > nul
wmic process where name='calc.exe' get commandline