-1
votes

Comment démarrer et tirer une commande

Il est censé être facile, mais je ne peux pas le faire fonctionner.

Quand j'exécute la commande suivante à l'intérieur de la cmd, cela fonctionne parfaitement bien. Lorsque j'exécute la commande à l'intérieur du code c # , il ne fera rien (aucune exception n'a été lancée non plus).

Voici la commande que j'utilise (qui fonctionne parfaitement bien lorsque vous utilisez directement sur cmd.exe ): xxx

voici ce que j'essaie de faire dans c # (ne fonctionne pas): xxx

suis-ce que je manque quelque chose? J'ai trouvé beaucoup de postes concernant C # à partir d'un processus, mais rien n'a résolu mon problème. J'ai également essayé de démarrer le processus avec startinfo et ajouté les propriétés telles que arguments , nom de fichier , etc., mais cela n'a pas fonctionné non plus. < / p>

être conscient, la question processus.start () arguments n'est pas la même - Dans mon cas, je neeset de définir la variable système (définir pgpassword) , car pg_restore n'a pas d'argument de mot de passe.


5 commentaires

Dupliqué possible de processus.start () arguments , vous devrez peut-être définir le workingdirectory ?


Vous n'avez pas besoin cmd pour commencer. L'application que vous souhaitez exécuter est pg_restore , pas cmd .


@ Çöđěxěŕ j'ai essayé avec le répertoire de travail, il n'a pas fonctionné


@Panagiikanavos - Non, quand je démarre pg_restore, je ne peux pas définir l'argument de mot de passe, c'est pourquoi j'ai besoin de définir l'attribut de cmd


@gala_m vous ne doit pas besoin de le faire, Processstartinfo vous permet de définir des variables d'environnement. cmd n'est rien de plus que la console


3 Réponses :


0
votes

Essayez ceci:

var command = "SET PGPASSWORD=mypassword && pg_restore.exe";
var param = "-U username -d dbname C:\file\to\dump\my.dump";
var process = new Process();
var processInfo = new ProcessStartInfo(command, param)
            {
                WorkingDirectory = @"%ProgramFiles%\PostgreSQL\12\bin"
            };
process.StartInfo = processInfo;
process.WaitForExit();


2 commentaires

Veuillez développer votre réponse par exemple sur votre réponse, où ils ont mal tourné et pourquoi. Il ne doit pas nécessairement être une solution complète et romantique qui détaille chaque étape, suffisamment suffisante pour donner à la vue un besoin afin de réaliser votre solution.


Cela ne fonctionne pas, je reçois l'exception "Aucun processus n'est associé à cet objet." "



0
votes

Vous devez préfixer votre chaîne d'arguments avec / c code> de sorte que cmd sait que vous le disez quoi faire:

var arg = @"/c cd %ProgramFiles%\PostgreSQL\12\bin && SET PGPASSWORD=mypassword&& pg_restore.exe -U username -d dbname C:\file\to\dump\my.dump";
Process.Start("cmd.exe", arg);


3 commentaires

L'utilisateur a-t-il même besoin du / c ? Pourquoi ne pas simplement l'appeler directement?


Tu as fait ma journée! Merci @Albie - Qu'est-ce qui est / c debout? Son travail, merci!


@gala_m Il n'y a aucune raison d'ouvrir une console pour exécuter un autre processus, pas même pour passer des variables d'environnement



1
votes

cmd est juste la console, il n'est pas nécessaire de démarrer un autre processus.

L'application que vous souhaitez exécuter est pg_restore.exe dans le fichier % \ postgreSQL \ 12 \ bin dossier. Vous pouvez transmettre des variables d'environnement via Processstartinfo.Environmentvariables Dictionnaire. Je ne sais pas si le constructeur Processstartinfo élargit les variables d'environnement. Vous pouvez utiliser Environnement.expandenvironmentvariables Pour que le chemin soit correct: xxx


2 commentaires

Cela ne fonctionne pas pour moi. J'ai copié votre code et j'ai changé les chemins - cela n'a rien fait, je viens de courir mais n'a pas eu d'effet.


@gala_m uniquement si pg_restore.exe a besoin d'accéder à d'autres fichiers dans le dossier bac . Le chemin complet de l'exécutable est déjà fourni dans la variable FullPath . J'ai changé le code pour utiliser le dossier bin en tant que répertoire de travail.