Почему использование pipe не работает в powershell? - PullRequest
1 голос
/ 29 июня 2009

Я пытаюсь выполнить следующую строку:

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

Отлично работает с cmd, но в powershell я получаю "Пустой элемент трубы не разрешен"

Почему это так и как это исправить?

Ответы [ 2 ]

5 голосов
/ 29 июня 2009

Что ж, команда exit не имеет выходных данных, поэтому нечего передавать по каналу, поэтому вы получаете пустой элемент конвейера. Так что, хотя нет ничего, что можно передать в другую команду, вопрос заключается в том, должна ли она вообще выполняться.

Кроме того, встроенные в cmd оболочки, такие как exit, dir и т. Д., Могут работать по-другому в Powershell. Псевдонимы просто для того, чтобы помочь привыкнуть.

И исправить это, вероятно, легко. Поскольку нет ничего, что можно было бы передать по конвейеру, ваше утверждение не имеет реального значения. Вы, вероятно, хотите запустить

sqlplus username/password@sid @test.sql
exit

ETA: Поскольку ваш комментарий указывает на совершенно другую проблему. Вы скопировали командную строку из этот ответ неправильно. Если вы хотите отправить текст"exit" команде позже в конвейере, вам необходимо каким-то образом вывести его. Это можно сделать как в cmd, так и в Powershell с помощью echo. Таким образом, вы не должны пропустить echo здесь:

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

В качестве альтернативы вы можете отправить «выход» напрямую в виде строки по конвейеру:

"exit" | sqlplus username/password@sid @test.sql
2 голосов
/ 29 июня 2009

Странный вопрос. Согласно сообщению SO и документации Oracle , похоже, что вы просто пытаетесь вернуть управление среде сценария после того, как SQLPlus завершит чтение файла.

В отличие от CMD, выход не является ключевым словом языка; это директива для скриптовой среды. (Вы можете убедиться сами, запустив «gcm exit» - ничего не найдете). Поэтому я не удивлен, что это не сработает.

Почему бы не добавить символ EOF в конец потока ввода, как предлагает документация Oracle? В Windows это будет ^ Z (Ctrl + Z, ASCII 0x1A). Или вы можете вставить текст «выход», если вы действительно хотите.

Сделайте это, изменив файл на диске или прочитав файл в поток и используя | оператор - в зависимости от того, что имеет больше смысла для вашей ситуации.

edit: добавление нескольких примеров скриптов для каждого запроса в комментариях

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...