O script em lote não está sendo executado quando chamado pelo Cmdlet Start-Process

5

Eu tenho um problema estranho em um Windows Server 2012 R2 que simplesmente não faz o menor sentido para mim.

Eu tenho um script do PowerShell que basicamente tem a seguinte estrutura:

Function Something-Different
{
    [...]
}

Function Start-Some-Batch
{
    Start-Process "K:\Path\To\Batch.cmd" 
}

Function Something-Else
{
    [...]
}

Something-Different
Start-Some-Batch
Something-Else

No entanto, o arquivo de lote K:\Path\To\Batch.cmd nunca é executado!

Mais algumas informações e fatos:

  • Todas as ações são realizadas com o mesmo usuário de domínio
  • A versão do PowerShell é 4.0
  • O arquivo em lote pode ser executado sem problemas ao clicar duas vezes nele no Windows Explorer
  • O script do PowerShell não fornece nenhuma saída de erro
  • A execução de Start-Process "K:\Path\To\Batch.cmd" diretamente de um console do PowerShell também não fornece nenhuma saída nem é acionada pelo script em lote
  • $error[0] está vazio após a execução
  • A função Something-Else está executando bem (o que significa que Start-Some-Batch não está impedindo que o script PS termine sua execução)
  • A execução do script do PowerShell elevado não altera uma coisa
  • Chamar o script em lote de um prompt do cmd.exe também não é iniciado (elevado ou não)
  • Estou suspeitando de qualquer um dos cem Security Settings que vêm por meio da política de grupo

O que poderia causar um comportamento tão estranho? Estou ficando sem ideias aqui.

    
por Matze 11.12.2014 / 16:23

2 respostas

1

Aqui está o que funciona para mim, usando o Powershell v4.

PS C:\Scripts> Start-Process cmd -ArgumentList "/c 1.cmd" -WorkingDirectory c:\test4

Em que 1.cmd reside em c:\test4

    
por 10.03.2015 / 23:33
0

A melhor solução encontrada para esse problema vem de um exemplo do Chocolatey para o método Start-ChocolateyProcessAsAdmin .

$somePath = "C:\Path with Spaces" # Like $env:ProgramFiles
$batFile= "$someVar\myfile.bat"
Start-Process -ArgumentList "/c ''$batFile''" -FilePath 'cmd.exe'

Note que pode ser entre aspas simples ou duplas dentro do -ArgumentList , elas só precisam de escape quando dentro de outras aspas.

Isso funciona porque a primeira "passagem" em que o PowerShell avalia a linha Start-Process resolverá o $ batFile para seu valor correto e, em seguida, passa o /c 'C:\Path with Spaces\myfile.bat' para o cmd.exe .

    
por 30.11.2016 / 20:45