Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么在powershell中使用管道不起作用?_Windows_Powershell_Scripting - Fatal编程技术网

Windows 为什么在powershell中使用管道不起作用?

Windows 为什么在powershell中使用管道不起作用?,windows,powershell,scripting,Windows,Powershell,Scripting,我正在尝试执行以下行: exit | sqlplus username/password@sid @test.sql cmd非常有效,但在powershell中我得到“不允许使用空管道元素” 这是为什么?我如何修复它?嗯,exit命令没有输出,因此没有任何东西可以通过管道传递,因此您会得到一个空的管道元素。因此,虽然没有任何东西可以导入到另一个命令中,但问题是它是否真的应该执行 此外,cmd中的shell内置项(如exit、dir等)在Powershell中的工作方式可能不同。这些别名只是为了

我正在尝试执行以下行:

exit | sqlplus username/password@sid @test.sql
cmd非常有效,但在powershell中我得到“不允许使用空管道元素”


这是为什么?我如何修复它?

嗯,
exit
命令没有输出,因此没有任何东西可以通过管道传递,因此您会得到一个空的管道元素。因此,虽然没有任何东西可以导入到另一个命令中,但问题是它是否真的应该执行

此外,cmd中的shell内置项(如exit、dir等)在Powershell中的工作方式可能不同。这些别名只是为了帮助人们习惯

解决这个问题可能很容易。因为没有什么可以传递给管道,所以你的陈述没有真正的意义。你可能想跑

sqlplus username/password@sid @test.sql
exit
预计到达时间:因为您的评论指出了一个完全不同的问题。您从错误的位置复制了命令行。如果要在管道中稍后将文本“exit”发送到命令,则需要以某种方式输出它。这可以通过
echo
在cmd和Powershell中完成。因此,您不应该在此处省略
回音

echo
退出| sqlplus用户名/password@sid@test.sql

或者,您可以直接将“exit”作为字符串沿管道发送:

"exit" | sqlplus username/password@sid @test.sql

嗯,
exit
命令没有输出,因此没有任何东西可以通过管道,因此您得到一个空的管道元素。因此,虽然没有任何东西可以导入到另一个命令中,但问题是它是否真的应该执行

此外,cmd中的shell内置项(如exit、dir等)在Powershell中的工作方式可能不同。这些别名只是为了帮助人们习惯

解决这个问题可能很容易。因为没有什么可以传递给管道,所以你的陈述没有真正的意义。你可能想跑

sqlplus username/password@sid @test.sql
exit
预计到达时间:因为您的评论指出了一个完全不同的问题。您从错误的位置复制了命令行。如果要在管道中稍后将文本“exit”发送到命令,则需要以某种方式输出它。这可以通过
echo
在cmd和Powershell中完成。因此,您不应该在此处省略
回音

echo
退出| sqlplus用户名/password@sid@test.sql

或者,您可以直接将“exit”作为字符串沿管道发送:

"exit" | sqlplus username/password@sid @test.sql

奇怪的问题。根据链接的SO post和,听起来您只是在SQLPlus读取完文件后尝试将控制权返回到脚本环境

与CMD不同,“exit”不是语言关键字;它是脚本环境的指令。(您可以通过运行“gcm exit”自行查看,但找不到任何内容)。所以我并不奇怪这不会起作用

为什么不像Oracle文档所建议的那样在输入流的末尾附加一个EOF字符呢?在Windows上,这将是^Z(Ctrl+Z,ASCII 0x1A)。或者,如果确实需要,可以插入文本“退出”

通过修改磁盘上的文件,或将文件读入流并使用|运算符来实现这一点——根据您的情况选择更合适的

编辑:在注释中为每个请求添加一些示例脚本

# 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

奇怪的问题。根据链接的SO post和,听起来您只是在SQLPlus读取完文件后尝试将控制权返回到脚本环境

与CMD不同,“exit”不是语言关键字;它是脚本环境的指令。(您可以通过运行“gcm exit”自行查看,但找不到任何内容)。所以我并不奇怪这不会起作用

为什么不像Oracle文档所建议的那样在输入流的末尾附加一个EOF字符呢?在Windows上,这将是^Z(Ctrl+Z,ASCII 0x1A)。或者,如果确实需要,可以插入文本“退出”

通过修改磁盘上的文件,或将文件读入流并使用|运算符来实现这一点——根据您的情况选择更合适的

编辑:在注释中为每个请求添加一些示例脚本

# 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

不,我想要的是正确的。请参阅本文:基本上,当sqlplus完成时,它会查看标准输入并在那里找到exit命令,并且知道如何退出。这是迄今为止我所知道的最简单的处理脚本未退出其自身有趣编辑的情况的方法,尽管我在命令提示符下所做的工作需要echo使其在powershell中工作。奇怪的是,这可能是cmd的许多奇怪之处之一。exit通常会结束cmd会话,但在我的测试中,当管道连接到另一个进程时,显然不会结束。它之所以有效,是因为当您将某些内容导入另一个进程时,在输入的末尾会得到一个隐式EOF。所以在那张便条上回音。| sqlplus。。。或者,哦……这是有道理的。奇怪的感觉,但是的。不,我想要的是正确的。请参阅本文:基本上,当sqlplus完成时,它会查看标准输入并在那里找到exit命令,并且知道如何退出。这是迄今为止我所知道的最简单的处理脚本未退出其自身有趣编辑的情况的方法,尽管我在命令提示符下所做的工作需要echo使其在powershell中工作。奇怪的是,这可能是cmd的许多奇怪之处之一。exit通常会结束cmd会话,但在我的测试中,当管道连接到另一个进程时,显然不会结束。它之所以有效,是因为当您将某些内容导入另一个进程时,在输入的末尾会得到一个隐式EOF。所以在那张便条上回音。| sqlplus。。。或者,哦……这是有道理的。奇怪的感觉,但是的。事实上,我可以做到,但它是一个简单的自动化很多麻烦!我必须学习如何将文件读入内存,附加到内存中,然后如何使其与sqlplus配合使用。希望有一种方法可以在2小时内完成此操作。<运算符不能在Powershell中使用。您可能需要使用Get内容和管道将文件重定向到程序的标准输入.G