Eu tenho um script do PowerShell que faz algumas coisas usando o diretório atual do script. Portanto, quando dentro desse diretório, a execução .\script.ps1
funciona corretamente.
Agora, quero chamar esse script de um diretório diferente sem alterar o diretório de referência do script. Então, eu quero chamar ..\..\dir\script.ps1
e ainda quero que esse script se comporte como foi chamado de dentro de seu diretório.
Como faço isso ou como modifico um script para que ele possa ser executado em qualquer diretório?
fonte
ant
com alguns parâmetros. Então, eu tenho que ligarant
dessa pasta para garantir que ele encontre o arquivo de configuração corretamente. Idealmente, estou procurando algo para alterar temporariamente o diretório de execução localmente dentro desse script.Push-Location
ePop-Location
Se você estiver chamando aplicativos nativos, não se preocupe com
[Environment]::CurrentDirectory
o$PWD
diretório atual do PowerShell . Por vários motivos, o PowerShell não define o diretório de trabalho atual do processo quando você define o local ou o local do envio, portanto, certifique-se de fazê-lo se estiver executando aplicativos (ou cmdlets) que esperam que seja definido.Em um script, você pode fazer isso:
Não há alternativa infalível para isso. Muitos de nós colocamos uma linha em nossa função de prompt para definir [Environment] :: CurrentDirectory ... mas isso não ajuda quando você está alterando o local em um script.
Duas notas sobre o motivo pelo qual isso não é definido automaticamente pelo PowerShell:
$PWD
diretório de trabalho atual, mas há apenas um processo e apenas um Ambiente.$PWD
nem sempre é um CurrentDirectory legal (você pode colocar um CD no provedor de registro, por exemplo).Se você quiser colocá-lo em seu prompt (que seria executado apenas no espaço de execução principal, com um único encadeamento), será necessário usar:
fonte
.\_/.
- por isso matou metade do meu dia! Pessoas, sério? Sério? ..[Environment]::CurrentDirectory
quando isso é diferente$PWD
. O correto seria armazená-lo em uma variável$origEnvDir = [Environment]::CurrentDirectory
e depois restaurá-lo[Environment]::CurrentDirectory = $origEnvDir
.Existem respostas com grande número de votos, mas quando li sua pergunta, pensei que você queria saber o diretório onde o script está, não aquele em que o script está sendo executado. Você pode obter as informações com as variáveis automáticas do powershell
Por exemplo, eu tenho o script $ profile que localiza o arquivo de solução do visual studio e o inicia. Eu queria armazenar o caminho completo, assim que um arquivo de solução fosse iniciado. Mas eu queria salvar o arquivo onde o script original existe. Então eu usei $ PsScriptRoot.
fonte
Eu costumava usar o código a seguir para importar um módulo que fica no mesmo diretório do script em execução. Primeiro, ele obterá o diretório no qual o PowerShell está sendo executado
fonte
Isso funcionaria bem.
fonte
Pop-Location
no final para retornar o caminho ao seu estado original.Bem, eu estava procurando solução para isso por um tempo, sem nenhum script apenas da CLI. É assim que eu faço xD:
Navegue para a pasta na qual você deseja executar o script (o importante é que você tenha conclusões de tabulação)
..\..\dir
Agora coloque a localização entre aspas duplas e, dentro delas
cd
, adicione , para que possamos invocar outra instância do PowerShell."cd ..\..\dir"
Adicione outro comando para executar o script separado por
;
, com um separador de comandos no powershell"cd ..\..\dir\; script.ps1"
Finalmente, execute-o com outra instância do PowerShell
start powershell "cd..\..\dir\; script.ps1"
Isso abrirá uma nova janela do PowerShell, vá para
..\..\dir
, executescript.ps1
e feche a janela.Observe que ";" apenas separa os comandos, como você os digitou um por um, se primeiro falhar, o segundo será executado e o próximo e o próximo depois ... Se você quiser manter a nova janela do PowerShell aberta, adicione -noexit no comando passado. Observe que eu primeiro naveguei para a pasta desejada para poder usar as conclusões da guia (você não pode usar aspas duplas).
start powershell "-noexit cd..\..\dir\; script.ps1"
Use aspas duplas
""
para poder passar diretórios com espaços nos nomes, por exemplo,start powershell "-noexit cd '..\..\my dir'; script.ps1"
fonte
Criei uma solução única da solução @ JohnL:
fonte