2009-06-29 8 views

Répondre

5

Eh bien, la commande exit n'a pas de sortie, donc il n'y a rien à transmettre dans le canal, donc vous obtenez un élément de pipeline vide. Donc, bien qu'il n'y ait rien à canaliser dans l'autre commande, la question est de savoir si elle devrait effectivement être exécutée.

De même, les interpréteurs shell intégrés à partir de cmd, tels que exit, dir, etc. peuvent fonctionner différemment dans Powershell. Les alias sont juste là pour vous aider à vous habituer.

Et la réparation est probablement facile. Parce qu'il n'y a rien à transmettre dans le pipeline, votre déclaration n'a aucune signification réelle. Vous voulez probablement lancer

sqlplus username/[email protected] @test.sql 
exit 

ETA: Comme votre commentaire indique un problème tout à fait différent. Vous avez copié la ligne de commande à partir de this answer incorrect. Si vous voulez envoyer le texte "exit" à la commande plus tard dans le pipeline, vous devrez le sortir d'une manière ou d'une autre. Cela peut être fait à la fois dans cmd et Powershell avec echo. Donc, vous ne devriez pas laisser le echo ici:

echoexit | sqlplus username/[email protected] @test.sql

Sinon, vous pouvez envoyer "exit" directement sous forme de chaîne dans le pipeline:

"exit" | sqlplus username/[email protected] @test.sql 
+0

Non, ce que je veux est correcte. Voir ce post: http://stackoverflow.com/questions/118233/run-oracle-sql-script-and-exit-from-sqlplus-exe-via-command-prompt –

+0

Fondamentalement, lorsque sqlplus est terminé, il se penche sur la norme entrée et trouve la commande de sortie là et sait sortir. C'est de loin la façon la plus simple de gérer la situation où le script ne se sort pas de lui-même. –

+1

Euh, vous voulez probablement inclure l'écho avant de quitter ... – Joey

2

question étrange. Selon la publication SO liée et le Oracle documentation, il semble que vous essayez simplement de renvoyer le contrôle à l'environnement de script après que SQLPlus a fini de lire le fichier. Contrairement à CMD, 'exit' n'est pas un mot-clé de langue; c'est une directive pour l'environnement de script. (Vous pouvez voir par vous-même en exécutant 'gcm exit' - ne trouvera rien). Donc je ne suis pas surpris que ça ne marche pas. Pourquoi ne pas ajouter un caractère EOF à la fin du flux d'entrée comme le suggère la documentation Oracle? Sous Windows, ce serait^Z (Ctrl + Z, ASCII 0x1A). Ou vous pouvez insérer le texte 'exit' si vous le voulez vraiment. Pour ce faire, modifiez le fichier sur le disque ou lisez le fichier dans un flux et utilisez le | opérateur - selon ce qui a le plus de sens pour votre situation.

edit: en ajoutant quelques exemples de scripts par requête dans les commentaires

# add EOF to file on disk 
[char]0x1a >> test.sql 
sqlplus username/[email protected] @test.sql 

# add 'exit' to file on disk 
'exit' >> test.sql 
sqlplus username/[email protected] @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/[email protected] 

# wrapper function 
function Invoke-SqlPlus($file) { (gc $file) + 'exit' | sqlplus username/[email protected] } 
new-alias sql Invoke-SqlPlus 
# usage 
sql test.sql 
+0

En effet, je pourrais le faire mais c'est beaucoup de tracas pour une automatisation simple! Je devrais apprendre à lire les fichiers dans la mémoire, les ajouter, et ensuite comment faire pour que ça fonctionne bien avec sqlplus. J'espère qu'il y a un moyen de le faire en moins de 2 heures. –

+0

L'opérateur Joey

+0

George: Vous pouvez probablement faire simplement [char] 0x1a >> test.sql pour obtenir le caractère EOF à la fin. – Joey

Questions connexes