我正在尝试执行以下行:
exit | sqlplus username/password@sid @test.sql
从cmd工作得很好但在powershell中我得到“不允许空管元素”
为什么会这样,我该如何解决?
答案 0 :(得分:5)
好吧,exit
命令没有输出,所以没有任何东西要传递给管道,因此你得到一个空的管道元素。因此,虽然没有什么可以管理到另一个命令,但问题是它是否实际上应该被执行。
此外,cmd中的shell-builtins(如exit,dir等)在Powershell中的工作方式可能不同。别名只是帮助你习惯。
修复此问题可能很容易。因为没有什么可以传递给管道,你的陈述没有任何实际意义。你可能想要运行
sqlplus username/password@sid @test.sql
exit
ETA:由于您的评论表明完全不同的问题。您从this answer错误地复制了命令行。如果要在管道中稍后将文本“exit”发送到命令,则需要以某种方式输出它。这可以使用echo
在cmd和Powershell中完成。所以你不应该忽略echo
这里:
echo
exit | sqlplus username/password@sid @test.sql
或者,您可以直接将“exit”作为字符串发送到管道:
"exit" | sqlplus username/password@sid @test.sql
答案 1 :(得分:2)
奇怪的问题。根据链接的SO帖子和Oracle documentation,听起来你只是在SQLPlus读完文件后尝试将控制权返回给脚本环境。
与CMD不同,'exit'不是语言关键字;它是脚本环境的指令。 (您可以通过运行'gcm exit'自己查看 - 找不到任何东西)。所以我并不感到惊讶,这不起作用。
为什么不像Oracle文档建议的那样将EOF字符附加到输入流的末尾?在Windows上,这将是^ Z(Ctrl + Z,ASCII 0x1A)。或者,如果你真的想要,你可以插入文本'exit'。
通过修改磁盘上的文件,或将文件读入流并使用|来执行此操作操作员 - 无论哪种情况对您的情况更有意义。
编辑:在评论中为每个请求添加一些示例脚本
# add EOF to file on disk
[char]0x1a >> test.sql
sqlplus username/password@sid @test.sql
# add 'exit' to file on disk
'exit' >> test.sql
sqlplus username/password@sid @test.sql
# add 'exit' in-memory
# assumes sqlplus reads from stdin as shown in other examples; don't have Oracle to test
(gc test.sql) + 'exit' | sqlplus username/password@sid
# wrapper function
function Invoke-SqlPlus($file) { (gc $file) + 'exit' | sqlplus username/password@sid }
new-alias sql Invoke-SqlPlus
# usage
sql test.sql