Essa deve ser uma tarefa simples, mas já vi várias tentativas de como obter o caminho para o diretório em que o cmdlet executado está localizado com sucesso misto. Por exemplo, quando eu executo C:\temp\myscripts\mycmdlet.ps1
um arquivo de configurações C:\temp\myscripts\settings.xml
, gostaria de poder armazenar C:\temp\myscripts
uma variável dentro dele mycmdlet.ps1
.
Esta é uma solução que funciona (embora um pouco complicada):
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'
Outro sugeriu esta solução, que funciona apenas em nosso ambiente de teste:
$settingspath = '.\settings.xml'
Eu gosto muito da última abordagem e prefiro ter que analisar o caminho do arquivo como parâmetro a cada vez, mas não consigo fazê-lo funcionar no meu ambiente de desenvolvimento. O que devo fazer? Tem algo a ver com a forma como o PowerShell está configurado?
fonte
Respostas:
A maneira confiável de fazer isso é exatamente como você mostrou
$MyInvocation.MyCommand.Path
.O uso de caminhos relativos será baseado em $ pwd, no PowerShell, no diretório atual de um aplicativo ou no diretório de trabalho atual de uma API .NET.
PowerShell v3 + :
Use a variável automática
$PSScriptRoot
.fonte
$PSScriptRoot
e$MyInvocation.MyCommand.Path
?Sim, isso deve funcionar. Mas se você precisa ver o caminho absoluto, é tudo o que precisa:
fonte
C:\mydir
e eu chamar o comandoC:\dir1\dir2\dir3\mycmdlet.ps1
, isso resolveráC:\mydir
nãoC:\dir1\dir2\dir3
. A chamada de um novo executável tem o mesmo problema, pois o diretório atual é herdado do processo pai.O método mais fácil parece ser usar a seguinte variável predefinida:
about_Automatic_Variables
eabout_Scripts
ambos afirmam:Eu uso assim:
fonte
Você também pode usar:
A peça entre parênteses retorna um
PathInfo
objeto.(Disponível desde o PowerShell 2.0.)
fonte
C:\mydir
e eu chamar o comandoC:\dir1\dir2\dir3\mycmdlet.ps1
, isso resolveráC:\mydir
nãoC:\dir1\dir2\dir3
. A chamada de um novo executável tem o mesmo problema, pois o diretório atual é herdado do processo pai.O caminho geralmente é nulo. Esta função é mais segura.
fonte
Experimentar :
ou:
fonte
$pwd
/$PWD
sempre que faço uma longa pausa no PowerShell! Portanto, muito mais útil IMO ...Get-Location
retornará o local atual:fonte
Eu gosto da solução de uma linha :)
fonte
Tente o seguinte:
fonte
No Powershell 3 e acima, você pode simplesmente usar
$PSScriptRoot
fonte
Você pensaria que usar '. \' Como o caminho significa que é o caminho da invocação. Mas não o tempo todo. Exemplo, se você o usar dentro de um trabalho ScriptBlock. Nesse caso, pode apontar para% profile% \ Documents.
fonte
Essa função definirá o local do prompt para o caminho do script, lidando com a maneira diferente de obter o caminho do script entre vscode, psise e pwd:
fonte
Pelo que vale a pena, por ser uma solução de linha única, a seguir é uma solução funcional para mim.
O 1 no final é ignorar o
/
.Graças às postagens acima, usando o cmdlet Get-Location .
fonte
A maioria das respostas não funciona ao depurar nos seguintes IDEs:
Porque nesses
$PSScriptRoot
está vazio eResolve-Path .\
(e similares) resultará em caminhos incorretos.A resposta de Freakydinde é a única que resolve essas situações, por isso votei positivamente , mas não acho
Set-Location
que a resposta seja realmente o que é desejado. Então eu corrigi isso e deixei o código um pouco mais claro:fonte
Para expandir a resposta do @Cradle: você também pode escrever uma função multiuso que obterá o mesmo resultado de acordo com a pergunta do OP:
fonte
Se você apenas precisar do nome do diretório atual, poderá fazer algo assim:
Supondo que você esteja trabalhando em C: \ Temp \ Location \ MyWorkingDirectory>
Resultado
MyWorkingDirectory
fonte
Eu tive problemas semelhantes e isso me causou muitos problemas, pois estou criando programas escritos no PowerShell (aplicativos de interface gráfica do usuário final) e tenho muitos arquivos e recursos que preciso carregar do disco. Da minha experiência, usar
.
para representar o diretório atual não é confiável. Ele deve representar o diretório de trabalho atual, mas geralmente não. Parece que o PowerShell salva o local do qual o PowerShell foi chamado dentro.
. Para ser mais preciso, quando o PowerShell é iniciado pela primeira vez, ele inicia, por padrão, dentro do diretório de usuário doméstico. Esse geralmente é o diretório da sua conta de usuário, algo comoC:\USERS\YOUR USER NAME
. Depois disso, o PowerShell altera o diretório para o diretório do qual você o invocou ou para o diretório em que o script que você está executando está localizado antes de apresentar o prompt do PowerShell ou de executar o script. Mas isso acontece depois que o próprio aplicativo PowerShell é iniciado originalmente dentro do diretório de usuário doméstico.E
.
representa o diretório inicial no qual o PowerShell foi iniciado. Portanto,.
apenas representa o diretório atual, caso você tenha chamado o PowerShell a partir do diretório desejado. Se você alterar posteriormente o diretório no código do PowerShell, as alterações não aparecerão.
em todos os casos. Em alguns casos,.
representa o diretório de trabalho atual e, em outros, do qual o PowerShell (não o script) foi invocado, o que pode levar a resultados inconsistentes. Por esse motivo, eu uso o script invoker. Script do PowerShell com interior comando único:POWERSHELL
. Isso garantirá que o PowerShell seja chamado do diretório desejado e, assim, tornará.
representa o diretório atual. Mas isso só funciona se você não alterar o diretório posteriormente no código do PowerShell. No caso de um script, eu uso o script invoker que é semelhante ao último que mencionei, exceto que contém uma opção de arquivo:POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1
. Isso garante que o PowerShell seja iniciado dentro do diretório de trabalho atual.Simplesmente clicar no script chama o PowerShell do diretório de usuário doméstico, não importa onde o script esteja localizado. Isso resulta no diretório de trabalho atual sendo o diretório em que o script está localizado, mas o diretório de chamada do PowerShell sendo
C:\USERS\YOUR USER NAME
e.
retornando um desses dois diretórios, dependendo da situação, o que é ridículo.Mas, para evitar toda essa confusão e usar o script invoker, você pode simplesmente usar um
$PWD
ou ao$PSSCRIPTROOT
invés de.
representar o diretório atual, dependendo do clima em que deseja representar o diretório de trabalho atual ou o diretório do qual o script foi invocado. E se você, por algum motivo, quiser recuperar outros dois diretórios.
retornados, poderá usá-lo$HOME
.Pessoalmente, tenho apenas um script de invocação no diretório raiz dos meus aplicativos que desenvolvo com o PowerShell, que invoca meu script de aplicativo principal, e lembre-se de nunca alterar o diretório de trabalho atual dentro do código-fonte do meu aplicativo, para que nunca precise me preocupar com isso, e posso usar
.
para representar o diretório atual e oferecer suporte ao endereçamento relativo de arquivos em meus aplicativos sem problemas. Isso deve funcionar em versões mais recentes do PowerShell (mais recentes que a versão 2).fonte