C # Processstartinfo Waitforexit
Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz pesquisa em vez de usar o evento (quando eles estão disponíveis), então você está usando CPU sem razão e que indicam que você é um programador ruim. Sua solução é realmente ruim quando comparado com o outro usando AutoResetEvent. (Mas eu não te dei -1 porque você tentou ajudar). Ndash Eric Ouellet Nov 7 14 at 18:38 Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema. A solução era NÃO desativar UseShellExecute. Eu agora recebi uma janela popup Shell, que é indesejável, mas muito melhor do que o programa esperando nada particular acontecer. Então eu adicionei o seguinte work-around para que: Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar. Respondeu Jan 13 15 at 10:35 Exemplo de uso ImplementationHello, eu posso obter PSEXEC para correr bem, mas quando eu passar em um argumento para registrar os resultados do MsiZap, não há log criado. Static void Main (string args) ProcessStartInfo startInfo novo ProcessStartInfo () startInfo. FileName quotpsexec. exequot startInfo. Arguments quotComputerName C: WSMGMTBINMsiZap. exe TW gtgt computernameCWSMGMTBinDateInTrayZap. logquot Process. Start (startInfo) Se eu eliminar o quotgtgt computernameCWSMGMTBinDateInTrayZap. logquot fora do Argumento, ele funciona bem. Mas quando eu adicioná-lo, ele nunca é executado. Estou apenas tentando fazer um registro dos resultados. Segunda-feira, 02 de fevereiro de 2015 7:28 PM Provavelmente você tem que interceptar a saída você mesmo usando startInfo. RedirectStandardOutput etc A documentação explica como fazê-lo. Para simplificar, tente criar um arquivo em lotes (.BAT) com uma única linha com comando completo. Em seguida, inicie-o usando a classe Process. Se ele funciona, em seguida, crie o arquivo em lotes programaticamente na pasta temporária (Path. GetTempPath) e, em seguida, removê-lo após Process. WaitForExit. Editado por Viorel MVP Terça-feira, 03 de fevereiro de 2015 7:47 Marcado como resposta por TheInfamousOne17 Sexta-feira, 06 de fevereiro de 2015 7:27 PM Terça-feira, 03 de fevereiro de 2015 7:44 AM Todas as respostas Você tem privilégios de administrador em locais e O PC remoto e os PCs locais e remotos estão no mesmo grupo O nome do arquivo de log tem um que indica os direitos de acesso de administrador. Você não precisa do sinal de dólar se a pasta é compartilhada. Segunda-feira, 02 de fevereiro de 2015 20h37 Eu ecoo o que Joel disse. Além disso, e não tenho certeza se este é o problema ou não, mas você pode querer considerar isso. Para marcar um aplicativo para sempre executar como um administrador, faça o seguinte: 1. No menu Iniciar, localize o programa que você deseja sempre executar como um administrador. 2. Clique com o botão direito do rato no atalho de aplicações e, em seguida, clique em Propriedades. 3. Na caixa de diálogo Propriedades, clique no separador Compatibilidade. 4. Efectue um dos seguintes procedimentos: Para aplicar a definição ao utilizador actualmente registado, seleccione a caixa de verificação Executar este programa como um administrador e, em seguida, clique em OK. Para aplicar a configuração a todos os usuários no computador e independentemente de qual atalho é usado para iniciar o aplicativo, clique em Alterar configuração para todos os usuários para exibir a caixa de diálogo Propriedades para o arquivo. exe aplicativos, selecione a executar este programa como uma verificação de administrador E, em seguida, clique em OK duas vezes. O conhecimento é a única coisa que eu posso lhe dar, e ainda reter, e nós dois somos melhores para ele. Segunda, 02 de fevereiro de 2015 9:49 Sim, tenho privilégios de administrador em ambas as máquinas. Esse não é o problema. Posso executar psexec. exe muito bem e eu posso chamar o MsiZap. exe muito bem. A parte que está falhando é o log que estou tentando passar para ele. Posso iniciar psexec e executar MsiZap. exe TW gtgt computernameCWSMGMTBinDateInTrayZap. logquot Isso funciona bem em ambas as máquinas manualmente. Eu posso executar processStartinfo como este. ProcessStartInfo startInfo novo ProcessStartInfo () startInfo. Arguments quotComputerName C: WSMGMTBINMsiZap. exe TW quot Process. Start (startInfo) Isso funciona bem. Mas quando eu tento adicionar ao startInfoArguments para canalizar para fora um log, ele não funciona. ProcessStartInfo startInfo novo ProcessStartInfo () startInfo. FileName quotpsexec. exequot startInfo. Arguments quotComputerName C: WSMGMTBINMsiZap. exe TW gtgt computernameCWSMGMTBinDateInTrayZap. logquot Terça-feira, 03 de fevereiro de 2015 1:56 AM Provavelmente você tem que interceptar a saída você mesmo usando startInfo. RedirectStandardOutput etc. A documentação explica como fazê-lo. Para simplificar, tente criar um arquivo em lotes (.BAT) com uma única linha com comando completo. Em seguida, inicie-o usando a classe Process. Se ele funciona, em seguida, crie o arquivo em lotes programaticamente na pasta temporária (Path. GetTempPath) e, em seguida, removê-lo após Process. WaitForExit. Editado por Viorel MVP Terça-feira, 03 de fevereiro de 2015 7:47 Marcado como resposta por TheInfamousOne17 sexta-feira, fevereiro 06, 2015 7:27 PM terça-feira, 03 de fevereiro de 2015 7:44 por favor tente este link: terça-feira, 03 de fevereiro de 2015 8:52 am por favor tente este link: Obrigado, o primeiro link realmente não ajudou, mas eu aprecio o link 2 com paexec. exe. (Poweradmin). Não ajudou com a tubulação para fora um registro, mas no entanto eu gosto de usar este de qualquer maneira porque parece ser mais updated. O único problema que eu tenho é quando eu tento pip para fora um log em adicionando isso para o startInfo. arguments: quotgtgt C: WSMGMTBinaLogName. logquot Eu vou manter o plugging afastado. Obrigado pelos links. Wednesday, February 04, 2015 1:07 AM Provavelmente você tem que interceptar a saída você mesmo usando startInfo. RedirectStandardOutput etc A documentação explica como fazê-lo. Para simplificar, tente criar um arquivo em lotes (.BAT) com uma única linha com comando completo. Em seguida, inicie-o usando a classe Process. Se ele funciona, em seguida, crie o arquivo em lotes programaticamente na pasta temporária (Path. GetTempPath) e, em seguida, removê-lo após Process. WaitForExit. Estou olhando para isso agora, eu corri em frente ontem, mas esqueceu de voltar e dar uma olhada. Vou voltar para você sobre isso. Quarta-feira, 04 de fevereiro de 2015 1:08 AM Eu acho que o WSMGMT é de propriedade de quotTrustedInstallerquot, então mesmo os administradores locais não podem escrever para ele (por razões de segurança) sem tomar posse. Considere a natureza da pasta WSMGMT, a rota para assumir a propriedade não é uma boa escolha porque contém arquivos que melhor mantêm fora do alcance de childrenquot (/ piada). Eu acho que seria melhor para você criar uma nova pasta para armazenar os arquivos de log. Quarta-feira, fevereiro 04, 2015 2:52 AM Obrigado, eu fiz você startInfo. RedirectStandardOutput e isso vai capturar tudo que eu preciso. É uma ótima alternativa e me deu muitas outras idéias. Embora eu não precisasse executar nada formam um arquivo de morcego. Eu posso apenas transmitir a saída para um arquivo também. Agradeço a ajuda. Parabéns para você. Editado por TheInfamousOne17 Sexta-feira, 06 de fevereiro de 2015 7:30 PM sexta-feira, 06 de fevereiro de 2015 7:28 PM A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite a nossa página UserVoice para submeter e votar em ideias Centros de desenvolvimento Recursos de aprendizagem Community Support ProgramsSystem. Diagnostics. ProcessStartInfoClass Assembly: System. dll Espaço de nome: System. Diagnostics Resumo Especifica um conjunto de valores utilizados ao iniciar um processo. C Sintaxe: public sealed class ProcessStartInfo Comentários ProcessStartInfo é usado em conjunto com o componente Process. Quando você inicia um processo usando a classe Process, você tem acesso a informações de processo além daquelas disponíveis ao anexar a um processo em execução. Você pode usar a classe ProcessStartInfo para maior controle sobre o processo que você iniciar. Você deve pelo menos definir a propriedade ProcessStartInfo. FileName, manualmente ou usando o construtor. O nome do arquivo é qualquer aplicativo ou documento. Aqui, um documento é definido como sendo qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode exibir os tipos de arquivos registrados e seus aplicativos associados para o computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se há uma ação aberta associada a um tipo de arquivo registrado específico. Além disso, você pode definir outras propriedades que definem ações a serem tomadas com esse arquivo. Você pode especificar um valor específico para o tipo da propriedade ProcessStartInfo. FileName para a propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte compartilhada CLI). Por exemplo, você pode especificar a impressão de um tipo de documento. Além disso, você pode especificar valores de propriedade ProcessStartInfo. Arguments para ser argumentos de linha de comando para passar para o procedimento aberto arquivos. Por exemplo, se você especificar um aplicativo de editor de texto na propriedade ProcessStartInfo. FileName, você pode usar a propriedade ProcessStartInfo. Arguments para especificar um arquivo de texto a ser aberto pelo editor. Entrada padrão é geralmente o teclado, e saída padrão e erro são geralmente a tela do monitor. No entanto, você pode usar o ProcessStartInfo. RedirectStandardInput. ProcessStartInfo. RedirectStandardOutput e ProcessStartInfo. RedirectStandardError propriedades para causar o processo para obter entrada de ou retornar saída para um arquivo ou outro dispositivo. Se você usar o Process. StandardInput. Process. StandardOutput. Ou Process. StandardError no componente Processar, você deve primeiro definir o valor correspondente na propriedade ProcessStartInfo. Caso contrário, o sistema lança uma exceção ao ler ou gravar no fluxo. Defina ProcessStartInfo. UseShellExecute para especificar se deve iniciar o processo usando o shell do sistema operacional. Você pode alterar o valor de qualquer propriedade ProcessStartInfo até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito. System. Diagnostics. ProcessStartInfo Lista de membros: Construtor padrão. Esse construtor é chamado por construtores de classe derivada para inicializar estado neste tipo. Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo. Sobrecarregado:.ctor (string fileName) Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo, como um aplicativo ou documento com o qual iniciar o processo. Sobrecarregado:.ctor (string fileName, string arguments) Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo de aplicativo com o qual iniciar o processo, bem como um conjunto de argumentos de linha de comando para passar para o aplicativo. Gest ou define o conjunto de argumentos de linha de comando a serem usados ao iniciar o aplicativo. Obtém caminhos de pesquisa para arquivos, diretórios para arquivos temporários, opções específicas do aplicativo e outras informações semelhantes. System. Diagnostics. ProcessStartInfo Detalhes do membro Sobrecarregado ctor 1 Resumo Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo. Construtor padrão. Esse construtor é chamado por construtores de classe derivada para inicializar estado neste tipo. C Sintaxe: Comentários Você deve definir pelo menos a propriedade ProcessStartInfo. FileName antes de iniciar o processo. O nome do arquivo é qualquer aplicativo ou documento. Nesse caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode exibir os tipos de arquivos registrados e seus aplicativos associados para o computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se há uma ação aberta associada a um tipo de arquivo registrado específico. Opcionalmente, você também pode definir outras propriedades antes de iniciar o processo. A propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportada na fonte compartilhada CLI) fornece ações a serem executadas, como print, com o arquivo indicado na propriedade ProcessStartInfo. FileName. A propriedade ProcessStartInfo. Arguments fornece uma maneira de passar argumentos de linha de comando para o arquivo quando o sistema o abre. Sobrecargado ctor 2 Resumo Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo, como um aplicativo ou documento com o qual iniciar o processo. C Sintaxe: Um aplicativo ou documento com o qual iniciar um processo. Comentários O nome do arquivo é qualquer aplicativo ou documento. Neste caso, um documento é definido como sendo qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode exibir os tipos de arquivos registrados e seus aplicativos associados para o computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se há uma ação aberta associada a um tipo de arquivo registrado específico. Você pode alterar a propriedade ProcessStartInfo. FileName depois de chamar esse construtor, até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito. Sobrecargado ctor 3 Resumo Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo de aplicativo com o qual iniciar o processo, bem como um conjunto de argumentos de linha de comando para passar para o aplicativo. C Sintaxe: Uma aplicação com a qual iniciar um processo. Argumentos de linha de comando para passar para o aplicativo quando o processo é iniciado. Comentários O nome do arquivo é qualquer aplicativo ou documento. Nesse caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode exibir os tipos de arquivos registrados e seus aplicativos associados para o computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se há uma ação aberta associada a um tipo de arquivo registrado específico. Você pode alterar as propriedades ProcessStartInfo. FileName ou ProcessStartInfo. Arguments depois de chamar esse construtor, até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito. Propriedade: Argumentos (leitura-escrita) Resumo Gest ou define o conjunto de argumentos de linha de comando a serem usados ao iniciar o aplicativo. C Sintaxe: Propriedade: EnvironmentVariables (somente leitura) Resumo Obtém caminhos de pesquisa para arquivos, diretórios para arquivos temporários, opções específicas do aplicativo e outras informações semelhantes. C Sintaxe: Propriedade: RedirectStandardError (read-write) Resumo Obtém ou define um valor indicando se a saída de erro do processo é gravada no processo Membros Process. StandardError, permitindo que você escreva para um destino diferente do fluxo de erro padrão tela do monitor). Usado para gravar dados de erro em um arquivo ou em um log, por exemplo. C Sintaxe: Comentários O componente Process comunica com um processo filho por meio de um pipe. Se um processo filho grava dados suficientes para o pipe para preencher o buffer, a criança irá bloquear até que o pai lê os dados do pipe. Isso pode causar deadlock se o aplicativo estiver lendo toda a saída para erro padrão e saída padrão, por exemplo, usando o código C a seguir. Neste exemplo, tanto o pai como os processos filho seriam bloqueados, como o canalizar preenchido impede que o processo filho de concluir, enquanto o processo pai está esperando indefinidamente para o processo filho para sair. Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (). do seguinte modo. Um problema semelhante surge se você redirecionar a saída padrão eo erro padrão e, em seguida, tente ler ambos, por exemplo, usando o seguinte código C. Neste caso, se o processo filho escreve qualquer texto para erro padrão ele irá bloquear o processo, porque o processo pai não pode ler a partir de erro padrão até que ele tenha terminado de leitura de saída padrão. No entanto, o processo pai não lerá de saída padrão até que o processo termina. Uma solução recomendada para esta situação é criar dois threads para que o aplicativo pode ler a saída de cada fluxo em um segmento separado. Propriedade: RedirectStandardInput (read-write) Resumo Obtém ou define um valor indicando se a entrada de comando do processo é lida do processo Membros Process. StandardInput membro, permitindo que você leia de uma fonte diferente do fluxo de entrada padrão (geralmente o teclado). Usado para ler dados de um arquivo, por exemplo. C Sintaxe: Propriedade: RedirectStandardOutput (read-write) Resumo Obtém ou define um valor indicando se a saída do processo é gravada no processo Membros Process. StandardOutput, permitindo que você escreva para um destino diferente do fluxo de saída padrão (geralmente o monitor tela). Usado para gravar dados em um arquivo, por exemplo. C Sintaxe: Comentários O componente Process comunica com um processo filho por meio de um pipe. Se um processo filho grava dados suficientes para o pipe para preencher o buffer, a criança irá bloquear até que o pai lê os dados do pipe. Isso pode causar deadlock se o aplicativo estiver lendo toda a saída para erro padrão e saída padrão, por exemplo, usando o código C a seguir. Neste exemplo, tanto o pai como os processos filho seriam bloqueados, como o canalizar preenchido impede que o processo filho de concluir, enquanto o processo pai está esperando indefinidamente para o processo filho para sair. Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (). do seguinte modo. Um problema semelhante surge se você redirecionar a saída padrão eo erro padrão e, em seguida, tente ler ambos, por exemplo, usando o seguinte código C. Neste caso, se o processo filho escreve qualquer texto para erro padrão ele irá bloquear o processo, porque o processo pai não pode ler a partir de erro padrão até que ele tenha terminado de leitura de saída padrão. No entanto, o processo pai não lerá de saída padrão até que o processo termina. Uma solução recomendada para esta situação é criar dois threads para que o aplicativo pode ler a saída de cada fluxo em um segmento separado. Propriedade: UseShellExecute (leitura e gravação) Resumo Obtém ou define um valor indicando se deseja usar o shell do sistema operacional para iniciar o processo. C Sintaxe: Comentários Definir essa propriedade como false permite redirecionar fluxos de entrada, saída e erro. Quando você usa o shell do sistema operacional para iniciar processos, é possível iniciar qualquer documento (que é qualquer tipo de arquivo registrado associado a um executável que tenha uma ação aberta padrão) e executar operações no arquivo, como impressão, com o processo componente. Quando ProcessStartInfo. UseShellExecute é false. Você pode iniciar apenas executáveis com o componente Process. Propriedade: WorkingDirectory (leitura-gravação) Resumo Obtém ou define o diretório inicial para o processo a ser iniciado. C Sintaxe: Comentários Se o diretório já faz parte da variável caminho do sistema, não é necessário repetir o location directorys nesta propriedade.
Comments
Post a Comment