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).