Noções básicas sobre executar o powershell dentro do lote com parâmetros

6

Eu tenho cavado isso por um tempo, mas não consegui entender como isso funciona. O que eu preciso é:

  1. Ser capaz de executar um arquivo em lote
  2. O arquivo de lote deve ter parâmetros
  3. Os parâmetros devem ser passados do arquivo em lotes para o script do PowerShell que está no mesmo arquivo

Por que eu preciso disso? Porque preciso executar um arquivo de lote simples para fazer algumas coisas, mas preciso de funcionalidade avançada que funcione apenas no PowerShell. Especificamente: eu preciso de um SaveFileDialog para alguma aplicação.

Segue-se o que tenho agora, onde tirei as partes complicadas de SaveFileDialog e deixei uma parte simples em lote + do powershell:

<# : 

@echo off
setlocal

powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF

#>

Write-Host "Hello, I'm PowerShell!"

Se eu colocar tudo isso em um arquivo de lote, digamos, myfile.bat . Ele é executado e chama o PowerShell e grava essa mensagem.

Minha pergunta / solicitação : como posso executar myfile.bat param1 param2 param3 e obter esses argumentos / parâmetros passados para o script do PowerShell? Eu realmente aprecio um exemplo mínimo que apenas imprime os parâmetros através do write-host do PowerShell.

Por favor, sinta-se à vontade para pedir mais detalhes. Obrigada!

    
por The Quantum Physicist 31.07.2016 / 15:52

3 respostas

1

Passando vários argumentos para um script do PowerShell via script em lote

Você pode usar algo como o método abaixo, já que consegui fazer o script em lote passar argumentos para o script PS usando essa sintaxe.

Ele precisa construir um script PS dinâmico superior (A rotina :DynamicPSScriptBuild ) e ele o excluirá se já existir e também o excluirá assim que terminar de processar todas as execuções.

Eu tive que usar o PS -file em vez do -iex (a razão pela qual o arquivo PS1 precisa existir e a construção dinâmica dele), mas funciona como esperado quando testei e passou os argumentos aplicáveis para o script um por um com cada argumento sendo uma iteração de execução de script PS.

Eu não tinha certeza se você precisava de todos os argumentos passados para o script PS um após o outro ou sendo passado de uma só vez ou como a lógica do script PS lida com vários argumentos passados para ela durante a mesma execução, mas talvez isso forneça detalhes suficientes para ajustar de acordo.

A parte do script abaixo que tem FOR %%A IN ("Hello I'm PowerShell!", "Goodbye I'm Leaving", "Come with it and get some more" será a parte que você coloca cada string para usar como um argumento a ser passado para o script PS, um após o outro, por iteração de execução, em que cada valor de string está entre aspas duplas e separados por vírgulas.

Exemplo de script

(convém ativar @ECHO OFF e remover o comando pause , pois usei esses para ajudar a mostrar tudo por iteração para confirmar todos funcionou como esperado)

<# : 

@ECHO ON
SETLOCAL

:DynamicPSScriptBuild
SET PSScript=%~f0.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
ECHO param($a)        >>"%PSScript%" 
ECHO Write-Host "$a"  >>"%PSScript%" 

:SetPSScriptArguments
FOR %%A IN (    "Hello I'm PowerShell!", 
                "Goodbye I'm Leaving", 
                "Come with it and get some more"
) DO CALL :Powershell "%%~A"
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
GOTO :EOF

:PowerShell
PowerShell -NoProfile -ExecutionPolicy Bypass -file "%PSScript%" "%~1"
pause
GOTO :EOF

Mais recursos

por 31.07.2016 / 21:19
1

How can I run myfile.bat param1 param2 param3, and get these arguments/parameters be passed to my PowerShell script?

Criar um script em lote para aceitar argumentos

Você obviamente precisaria escalar os argumentos em lote com o subseqüente SET arg#=%~#

Eu fiz o script de lote de exemplo mostrar as variáveis de configuração de argumentos no topo e tê-las passado para um script de PS que será vinculado com um resultado final mais tarde para ajudar a esclarecer mais no final desta resposta.

Exemplo de script em lote

@ECHO ON

SET arg1=%~1
SET arg2=%~2
SET arg3=%~3
SET arg4=%~4

SET PSScript=C:\Users\User\Desktop\Test.ps1

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%arg1%' '%arg2%' '%arg3%' '%arg4%'"
EXIT /B

Crie um script do PowerShell para aceitar argumentos

Você obviamente precisaria escalar os argumentos do PowerShell com o subseqüente $arg#=$args[#]

Exemplo de script do PowerShell

$arg1=$args[0]
$arg2=$args[1]
$arg3=$args[2]
$arg4=$args[3]

Write-Host "$arg1 is a beauty!!"
Write-Host "$arg2 is cool!!"
Write-Host "$arg3 has body odor!!"
Write-Host "$arg4 is a beast!!"

Amarrando juntos

  • Transmita argumentos para o script em lote:

    • c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie"
  • Transmita argumentos para o script do PowerShell:

  • Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'
    
  • Resultados completos ecoam em:

  • c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie"
    
    SET arg1=Selena
    
    SET arg2=Justin
    
    SET arg3=Donald
    
    SET arg4=Bernie
    
    SET PSScript=C:\Users\User\Desktop\Test.ps1
    
    SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
    
    CD /D "C:\Windows\System32\WindowsPowerShell\v1.0"
    
    Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'"
    Selena is a beauty!!
    Justin is cool!!
    Donald has body odor!!
    Bernie is a beast!!
    

Maisrecursos

  • Argumentos da linha de comando (parâmetros)

    %* in a batch script refers to all the arguments (e.g. %1 %2 %3 %4 %5 ...%255) only arguments %1 to %9 can be referenced by number.

  • Parâmetros / argumentos do PowerShell

por 25.05.2017 / 04:49
0

Passe a variável em lote diretamente para sua linha Powershell de dentro do arquivo em lote. Para testar isso, eu passei o cmdlet Write-Host como argumento.

foo.bat :

@echo off

set arg1=%1

powershell.exe %1 "this is from powershell"

pause

Iniciando o .bat com um argumento,

.\foo.bat Write-Host

Saída:

this is from powershell
Press any key to continue . . .
    
por 01.08.2016 / 18:18