Nota: PowerShell 1.0
Me gustaría obtener el nombre de archivo de PowerShell en ejecución actual. Es decir, si comienzo mi sesión así:
powershell.exe .\myfile.ps1
Me gustaría obtener la cadena ". \ Myfile.ps1" (o algo así). EDITAR : "myfile.ps1" es preferible.
¿Algunas ideas?
powershell
Ron Klein
fuente
fuente
Respuestas:
He intentado resumir las diversas respuestas aquí, actualizado para PowerShell 5:
Si solo usa PowerShell 3 o superior, use
$PSCommandPath
Si desea compatibilidad con versiones anteriores, inserte la cuña:
if ($PSCommandPath -eq $null) { function GetPSCommandPath() { return $MyInvocation.PSCommandPath; } $PSCommandPath = GetPSCommandPath; }
Esto agrega
$PSCommandPath
si aún no existe.El código de corrección se puede ejecutar en cualquier lugar (nivel superior o dentro de una función), aunque la
$PSCommandPath
variable está sujeta a las reglas de alcance normales (por ejemplo, si coloca la corrección en una función, la variable tiene el alcance únicamente para esa función).Detalles
Hay 4 métodos diferentes utilizados en varias respuestas, así que escribí este script para demostrar cada uno (más
$PSCommandPath
):Salida:
Notas:
C:\
, pero el script real esC:\Test\test.ps1
..\Test\test.ps1
)$PSCommandPath
es la única forma confiable, pero se introdujo en PowerShell 3fuente
$PSCommandPath
si no se requiere el legado (WindowsXP).function PSCommandPath
) y una referencia a la función incorrecta (Write-Host " * Direct: $PSCommandPath"; Write-Host " * Function: $(ScriptName)";
- ¿o estoy pasando por alto algo obvio?Si bien la respuesta actual es correcta en la mayoría de los casos, hay ciertas situaciones en las que no le dará la respuesta correcta. Si usa dentro de las funciones de su script, entonces:
Devuelve el nombre de la función en lugar del nombre del script.
Le dará " prueba " sin importar cómo se llame su script. El comando correcto para obtener el nombre del script es siempre
esto devuelve la ruta completa del script que está ejecutando. Si solo necesita el nombre del archivo de secuencia de comandos, este código debería ayudarlo:
fuente
$MyInvocation.ScriptName
devuelve una cadena vacía para mí, PS v3.0.$MyInvocation.ScriptName
solo funciona desde dentro de una función. Vea mi respuesta a continuación .Si solo desea el nombre del archivo (no la ruta completa), use esto:
fuente
Prueba lo siguiente
Es posible que esto no le proporcione la ruta real escrita, pero le dará una ruta válida al archivo.
fuente
$path = Split-Path $MyInvocation.MyCommand.Definition -Parent
Si está buscando el directorio actual en el que se está ejecutando el script, puede probar este:
fuente
C:\ilike.ps123\ke.ps1
, ¿verdad?Replace()
método reemplaza cada aparición de la aguja (no solo la última aparición) y también lo probé. Sin embargo, es una buena idea hacer algo como restar cadenas.String.TrimEnd()
($currentExecutingPath = $fullPathIncFileName.TrimEnd($currentScriptName)
)? - Funciona correctamente:"Ich bin Hamster".TrimEnd("ster")
vuelveIch bin Ham
y"Ich bin Hamsterchen".TrimEnd("ster")
vuelveIch bin Hamsterchen
(en lugar deIch bin Hamchen
) - ¡Bien!$currentScriptPath = $MyInvocation.MyCommand.Definition; $currentScriptName = $MyInvocation.MyCommand.Name; $currentScriptDir = $currentScriptPath.Substring(0,$currentScriptPath.IndexOf($currentScriptName));
cuidado: a diferencia de las variables automáticas
$PSScriptRoot
y$PSCommandPath
, las propiedadesPSScriptRoot
yPSCommandPath
del$MyInvocation
variable automática contienen información sobre el invocador o el script de llamada, no sobre el script actual.p.ej
... donde
DPM.ps1
contienefuente
Yo diría que hay un método mejor, estableciendo el alcance de la variable $ MyInvocation.MyCommand.Path:
ex> $ script : MyInvocation.MyCommand.Name
Este método funciona en todas las circunstancias de invocación:
EJ .: Somescript.ps1
SALIDA:
Observe cómo la respuesta aceptada anterior NO devuelve un valor cuando se llama desde Main. Además, tenga en cuenta que la respuesta aceptada anterior devuelve la ruta completa cuando la pregunta solicitó solo el nombre del script. La variable de ámbito funciona en todos los lugares.
Además, si quisiera la ruta completa, simplemente llamaría:
fuente
Como se señaló en respuestas anteriores, el uso de "$ MyInvocation" está sujeto a problemas de alcance y no necesariamente proporciona datos consistentes (valor de retorno frente a valor de acceso directo). Descubrí que el método "más limpio" (más consistente) para obtener información del script, como la ruta del script, el nombre, los parámetros, la línea de comando, etc., independientemente del alcance (en las llamadas de función principal o subsiguientes / anidadas) es usar "Get- Variable "en" MyInvocation "...
Por lo tanto, puede obtener la misma información que $ PSCommandPath, pero mucho más en el trato. No estoy seguro, pero parece que "Get-Variable" no estuvo disponible hasta PS3, por lo que no fue de mucha ayuda para sistemas realmente antiguos (no actualizados).
También hay algunos aspectos interesantes al usar "-Scope", ya que puede retroceder para obtener los nombres, etc. de las funciones que llaman. 0 = actual, 1 = padre, etc.
Espero que esto sea algo útil.
Ref, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable
fuente
Hice algunas pruebas con el siguiente script, tanto en PS 2 como en PS 4, y obtuve el mismo resultado. Espero que esto ayude a la gente.
Resultados -
fuente
Esto puede funcionar en la mayoría de las versiones de PowerShell:
Esto puede funcionar para trabajos programados
fuente