Executando o comando CMD no PowerShell

87

Estou tendo um monte de problemas para executar um comando do PowerShell. Tudo o que está fazendo é executar um comando que seria executado em uma janela de prompt do CMD.

Aqui está o comando:

"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

Tentei o seguinte sem sucesso (tentei muitas iterações para tentar obter uma que funcionasse. Provavelmente a sintaxe está toda confusa):

$TEXT = $textbox.Text #$textbox is where the user enters the PC name.
$CMDCOMMAND = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"
Start-Process '"$CMDCOMMAND" $TEXT'
#iex -Command ('"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"' $TEXT)

O comando apenas abrirá a janela de conexão remota do SCCM para o computador especificado pelo usuário na caixa de texto.

user3585839
fonte
Não tenho certeza de qual versão do SCCM você está usando, mas 07 requer um "-1", mas 2012 não ao iniciar o CmRcViewer. Apenas um FYI.
Kevin_

Respostas:

101

Experimente isto:

& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

Para o PowerShell, uma string "..." é apenas uma string e o PowerShell a avalia ecoando-a na tela. Para fazer o PowerShell executar o comando cujo nome está em uma string, você usa o operador de chamada &.

Keith Hill
fonte
Incrível, isso funcionou. Isso deve funcionar para a maioria dos comandos cmd?
user3585839
4
Sim, mas não é necessário para exes que não tenham um espaço no nome ou no caminho. Por exemplo, você pode executar ipconfig.exesem precisar usar &. A única vez que você precisa usar &é invocar um nome de comando na forma de string. E você deve usar a "forma de string" quando houver um espaço no caminho ou nome do arquivo.
Keith Hill
17
Eu acrescentaria que não funcionará construir uma string de linha de comando e tentar executá-la &, porque o PowerShell pensará que toda a string é o nome do executável. Em vez disso, cite apenas o nome do executável e coloque os parâmetros do executável depois.
Bill_Stewart
Qual é a diferença entre &e cmd?
Timo
1
&é o operador de chamada do PowerShell (também conhecido como invocação). Ele permite que você execute um comando quando o que você tem é uma string que contém o nome do comando ou o caminho para o exe. Você também pode especificar um scriptblock, por exemplo, &{$foo=42}ou um objeto CommandIno, por exemplo $cmd = Get-Command Get-Date; &$cmd. cmdé uma concha diferente. Observe que é &executado em um escopo filho, portanto, você notará que após o scriptblock que define $fooacima terminar, $foonão está mais definido.
Keith Hill
55

Para executar ou converter arquivos em lote externamente do PowerShell (especialmente se você deseja assinar todos os seus scripts de tarefas agendadas com um certificado), simplesmente crio um script do PowerShell, por exemplo, deletefolders.ps1.

Insira o seguinte no script:

cmd.exe /c "rd /s /q C:\#TEMP\test1"

cmd.exe /c "rd /s /q C:\#TEMP\test2"

cmd.exe /c "rd /s /q C:\#TEMP\test3"

* Cada comando precisa ser colocado em uma nova linha chamando cmd.exe novamente.

Este script agora pode ser assinado e executado a partir do PowerShell, gerando os comandos cmddiretamente no prompt de comando .

É uma maneira muito mais segura do que executar arquivos em lote!

Armand G.
fonte
Isso funcionou muito bem para mim. Eu estava tentando executar: sc query serviceNamedo PowerShell pensando que seria executado, mas sem saída. Tentei várias iterações da técnica &, sem dados. Mas executá-lo da maneira que você recomendou funcionou. Em seguida, clico em cmd.exe /? para ver que outras maravilhas me aguardavam. Eu só gosto de executar cmd quando necessário.
Paul Masek
9

Uma solução seria canalizar seu comando do PowerShell para o CMD. Executar o comando a seguir canalizará o notepad.execomando para o CMD, que abrirá o aplicativo Bloco de notas.

PS C:\> "notepad.exe" | cmd

Depois que o comando for executado no CMD, você retornará ao prompt do PowerShell e poderá continuar executando o script do PowerShell.


Editar% s

A mensagem de inicialização do CMD é mostrada

Como mklement0 aponta, este método mostra a mensagem de inicialização do CMD. Se você copiar a saída usando o método acima em outro terminal, a mensagem de inicialização será copiada junto com ela.

reelyard
fonte
Pode funcionar mesmo quando &não funciona. Por exemplo & "mklink", não funcionou para mim enquanto "mklink" | cmdtrabalhava
moudrick
2

Para quem precisa desta informação:

Eu descobri que você pode executar um comando que está em seu PATHscript PS e deve funcionar.

Às vezes você pode ter que pré-lançar este comando com cmd.exe /c

Exemplos

Chamando git de um script PS

Tive de reempacotar um gitcliente embrulhado Chocolatey(para quem não sabe, é uma espécie de app-store para Windows) que usa scripts PS em massa.

Eu descobri que, uma vez gitno PATH, comandos como

$ca_bundle = git config --get http.sslCAInfo

irá armazenar a localização do git crtarquivo na $ca_bundlevariável.

Procurando um aplicativo

Outro exemplo que é uma combinação do presente SO post e este SO post é o uso do wherecomando

$java_exe = cmd.exe /c where java

irá armazenar a localização do java.exearquivo na $java_exevariável.

avi.elkharrat
fonte
1
Você só precisa cmd /cinvocar seus comandos internos , como mklink. Em contraste, where.exeé um programa externo, portanto, você pode invocá-lo diretamente. No entanto, devido a um conflito de nome com o wherealias interno do PowerShell (para Where-Object), você deve usar where.exe; por exemplo where.exe java,.
mklement0
Ou apenas use o PowerShell em Get-Commandvez de chamar cmd? O mesmo de antes:$java_exe = $(Get-Command java.exe).Source
dtasev
-1

Você deve usar o cmdlet Invoke-Command para iniciar este programa externo. Normalmente funciona sem esforço.

Se precisar de mais de um comando, você deve usar o cmdlet Invoke-Expression com a -scriptblockopção.

Tim Christin
fonte
1
Invoke-Command não é necessário neste caso (veja a resposta de Keith Hill).
Bill_Stewart
Sim, eu concordo com isso. Eu estava mais pensando na solução de script.
Tim Christin
4
Não importa se o comando é executado a partir de um script ou não. Ainda não é necessário usar Invoke-Command neste caso.
Bill_Stewart
Além disso, Invoke-Expression deve ser evitado
mklement0
Não forneça "respostas" sem exemplo
AX