Observação: PowerShell 1.0
, gostaria de obter o nome do arquivo PowerShell em execução no momento. Ou seja, se eu começar minha sessão assim:
powershell.exe .\myfile.ps1
Eu gostaria de obter a string ". \ Myfile.ps1" (ou algo parecido). EDIT : "myfile.ps1" é preferível.
Alguma ideia?
powershell
Ron Klein
fonte
fonte
Respostas:
Tentei resumir as várias respostas aqui, atualizadas para PowerShell 5:
Se você estiver usando apenas PowerShell 3 ou superior, use
$PSCommandPath
Se quiser compatibilidade com versões mais antigas, insira o calço:
if ($PSCommandPath -eq $null) { function GetPSCommandPath() { return $MyInvocation.PSCommandPath; } $PSCommandPath = GetPSCommandPath; }
Isso adiciona
$PSCommandPath
se ainda não existir.O código do shim pode ser executado em qualquer lugar (nível superior ou dentro de uma função), embora a
$PSCommandPath
variável esteja sujeita às regras normais de escopo (por exemplo, se você colocar o shim em uma função, a variável terá o escopo apenas dessa função).Detalhes
Existem 4 métodos diferentes usados em várias respostas, então escrevi este script para demonstrar cada um (mais
$PSCommandPath
):Resultado:
Notas:
C:\
, mas o script real éC:\Test\test.ps1
..\Test\test.ps1
)$PSCommandPath
é a única maneira confiável, mas foi introduzida no PowerShell 3fonte
$PSCommandPath
se o legado (WindowsXP) não for necessário.function PSCommandPath
) e uma referência à função errada (Write-Host " * Direct: $PSCommandPath"; Write-Host " * Function: $(ScriptName)";
- ou estou ignorando algo óbvio?Embora a Resposta atual esteja certa na maioria dos casos, há certas situações em que ela não fornecerá a resposta correta. Se você usar dentro de suas funções de script:
Retorna o nome da função em vez do nome do nome do script.
Fornecerá um " teste " independentemente do nome do seu script. O comando certo para obter o nome do script é sempre
isso retorna o caminho completo do script que você está executando. Se você precisa apenas do nome do arquivo do script, este código deve ajudá-lo:
fonte
$MyInvocation.ScriptName
retorna uma string vazia para mim, PS v3.0.$MyInvocation.ScriptName
só funciona dentro de uma função. Veja minha resposta abaixo .Se você deseja apenas o nome do arquivo (não o caminho completo), use este:
fonte
Tente o seguinte
Isso pode não fornecer o caminho real digitado, mas fornecerá um caminho válido para o arquivo.
fonte
$path = Split-Path $MyInvocation.MyCommand.Definition -Parent
Se você está procurando o diretório atual no qual o script está sendo executado, você pode tentar este:
fonte
C:\ilike.ps123\ke.ps1
, não é?Replace()
método substitui todas as ocorrências da agulha (não apenas a última ocorrência) e eu também testei. No entanto, é uma boa ideia fazer algo como a subtração de cordas.String.TrimEnd()
($currentExecutingPath = $fullPathIncFileName.TrimEnd($currentScriptName)
)? - Está funcionando corretamente:"Ich bin Hamster".TrimEnd("ster")
retornaIch bin Ham
e"Ich bin Hamsterchen".TrimEnd("ster")
retornaIch bin Hamsterchen
(em vez deIch bin Hamchen
) - Tudo bem!$currentScriptPath = $MyInvocation.MyCommand.Definition; $currentScriptName = $MyInvocation.MyCommand.Name; $currentScriptDir = $currentScriptPath.Substring(0,$currentScriptPath.IndexOf($currentScriptName));
cuidado: Ao contrário das variáveis automáticas
$PSScriptRoot
e$PSCommandPath
, as propriedadesPSScriptRoot
ePSCommandPath
da$MyInvocation
variável automática contêm informações sobre o invocador ou o script de chamada, não o script atual.por exemplo
... onde
DPM.ps1
contémfonte
Eu diria que existe um método melhor, definindo o escopo da variável $ MyInvocation.MyCommand.Path:
ex> $ script : MyInvocation.MyCommand.Name
Este método funciona em todas as circunstâncias de invocação:
EX: Somescript.ps1
RESULTADO:
Observe como a resposta aceita acima NÃO retorna um valor quando chamada de Main. Além disso, observe que a resposta aceita acima retorna o caminho completo quando a pergunta solicitou apenas o nome do script. A variável com escopo funciona em todos os lugares.
Além disso, se você quiser o caminho completo, basta chamar:
fonte
Conforme observado nas respostas anteriores, o uso de "$ MyInvocation" está sujeito a problemas de escopo e não necessariamente fornece dados consistentes (valor de retorno vs. valor de acesso direto). Descobri que o método "mais limpo" (mais consistente) para obter informações de script, como caminho de script, nome, parâmetros, linha de comando, etc., independentemente do escopo (em chamadas de função principal ou subsequentes / aninhadas) é usar "Get- Variável "em" MyInvocation "...
Portanto, você pode obter as mesmas informações de $ PSCommandPath, mas muito mais no negócio. Não tenho certeza, mas parece que "Get-Variable" não estava disponível até o PS3, então não é uma grande ajuda para sistemas realmente antigos (não atualizados).
Existem também alguns aspectos interessantes ao usar "-Scope", pois você pode retroceder para obter os nomes, etc. da (s) função (ões) de chamada. 0 = atual, 1 = pai, etc.
Espero que isso seja de alguma forma útil.
Ref, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable
fonte
Fiz alguns testes com o seguinte script, tanto no PS 2 quanto no PS 4 e obteve o mesmo resultado. Espero que isso ajude as pessoas.
Resultados -
fonte
Isso pode funcionar na maioria das versões do PowerShell:
Isso pode funcionar para trabalho agendado
fonte