Quero execução de chamada para um script myScript1.ps1 dentro de um segundo script myScript2.ps1 dentro do Powershell ISE.
O código a seguir no MyScript2.ps1 funciona bem na Administração do Powershell, mas não funciona no PowerShell ISE:
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
Eu obtenho o seguinte erro ao executar o MyScript2.ps1 no PowerShell ISE:
O termo '. \ MyScript1.ps1' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável. Verifique a ortografia do nome ou, se um caminho foi incluído, verifique se o caminho está correto e tente novamente.
fonte
O caminho atual de MyScript1.ps1 não é o mesmo que myScript2.ps1. Você pode obter o caminho da pasta MyScript2.ps1 e concatená-lo para MyScript1.ps1 e, em seguida, executá-lo. Ambos os scripts devem estar no mesmo local.
fonte
Estou chamando myScript1.ps1 de myScript2.ps1.
Supondo que os dois scripts estejam no mesmo local, primeiro obtenha o local do script usando este comando:
E, em seguida, acrescente o nome do script que você deseja chamar assim:
Isso deve funcionar.
fonte
& "$PSScriptRoot\myScript1.ps1"
é suficienteSolução de uma linha:
fonte
& '.\MyScript1.ps'
se o script reside no mesmo diretório?Esta é apenas uma informação adicional para as respostas, a fim de passar o argumento para outro arquivo
Onde você espera argumento
PrintName.ps1
Como chamar o arquivo
Se você não não fornecer qualquer entrada que será o padrão para "Joe" e isso vai ser passado como argumento em argumento printName em PrintName.ps1 arquivo que por sua vez imprimir o "Joe" corda
fonte
Você já deve ter encontrado a resposta, mas aqui está o que eu faço.
Eu costumo colocar esta linha no início dos meus scripts de instalação:
Então eu posso usar a variável $ PSScriptRoot como um local do script atual (caminho), como no exemplo abaixo:
No seu caso, você pode substituir
Iniciar processo ... alinhado com
Invoke-Expression $ PSScriptRoot \ ScriptName.ps1
Você pode ler mais sobre as variáveis automáticas $ MYINVOCATION e $ PSScriptRoot no site da Microsoft: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables
fonte
Para executar facilmente um arquivo de script na mesma pasta (ou subpasta de) do chamador, você pode usar isso:
fonte
Eu tive um problema com isso. Eu não usei nada inteligente
$MyInvocation
para consertar isso. Se você abrir o ISE clicando com o botão direito do mouse em um arquivo de script e selecionandoedit
abrir o segundo script a partir do ISE, poderá invocar um do outro usando a sintaxe normal . \ Script.ps1 . Meu palpite é que o ISE tem a noção de uma pasta atual e abri-la assim define a pasta atual para a pasta que contém os scripts. Quando invoco um script de outro em uso normal, apenas uso . \ Script.ps1 , IMO é errado modificar o script apenas para fazê-lo funcionar no ISE corretamente ...fonte
Eu tive um problema semelhante e resolvi desta maneira.
Meu diretório de trabalho é uma pasta de script geral e uma pasta de script específica para servidor na mesma raiz, preciso chamar uma pasta de script específica (que chama de script geral com o parâmetro do problema específico). Então diretório de trabalho é assim
Solutions1 e Solutions2 chamam o PS1 na pasta Scripts carregando o parâmetro armazenado em ParameterForSolution. Assim, no PowerShell ISE, eu executo este comando
E o código dentro de Solution1.PS1 é:
fonte
Submeto meu exemplo para consideração. É assim que eu chamo algum código de um script do controlador nas ferramentas que eu faço. Os scripts que executam o trabalho também precisam aceitar parâmetros, portanto, este exemplo mostra como passá-los. Ele assume que o script que está sendo chamado está no mesmo diretório que o script do controlador (script que faz a chamada).
O acima é um script de controlador que aceita 3 parâmetros. Eles são definidos no bloco param. O script do controlador chama o script Get-ZAEventLogData.ps1. Por uma questão de exemplo, este script também aceita os mesmos três parâmetros. Quando o script do controlador chama o script que faz o trabalho, ele precisa chamá-lo e passar os parâmetros. O exemplo acima mostra como eu faço isso splatting.
fonte
Como você executa scripts internos do PowerShell dentro de seus scripts?
Como você usa scripts internos como
Esses são executados pelo seu computador, verificando automaticamente o caminho do script.
Da mesma forma, eu posso executar meus scripts personalizados apenas colocando o nome do script no bloco de scripts
Vá para a linha de comando do PowerShell e digite
Isso retornará o caminho para um arquivo que nossa linha de comando do PowerShell executará toda vez que você abrir o aplicativo.
Isso parecerá assim
Vá para Documentos e veja se você já possui um diretório WindowsPowerShell. Eu não fiz, então
Agora, criamos o script que será iniciado sempre que abrirmos o aplicativo PowerShell.
A razão pela qual fizemos isso foi para podermos adicionar nossa própria pasta que contém todos os nossos scripts personalizados. Vamos criar essa pasta e chamo-a de "Bin" após os diretórios nos quais o Mac / Linux contém seus scripts.
Agora queremos que esse diretório seja adicionado à nossa
$env:path
variável toda vez que abrirmos o aplicativo, volte para oWindowsPowerShell
Diretório eEntão adicione isso
Agora, o shell encontrará automaticamente seus comandos, desde que você salve seus scripts nesse diretório "Bin".
Reinicie o PowerShell e deve ser um dos primeiros scripts executados.
Execute isso na linha de comando após recarregar para ver seu novo diretório na sua variável de caminho:
Agora podemos chamar nossos scripts a partir da linha de comando ou de outro script, da seguinte maneira:
Como você vê, devemos chamá-los com a
.ps1
extensão até criarmos pseudônimos para eles. Se queremos ser extravagantes.fonte