Pregunta

Esta debería ser una tarea simple, pero he visto varios intentos sobre cómo obtener el camino al directorio donde el cmdlet ejecutado se encuentra con éxito mixto. Por ejemplo, cuando ejecuto C:\temp\myscripts\mycmdlet.ps1 que tiene un archivo de configuración en C:\temp\myscripts\settings.xml Me gustaría poder almacenar C:\temp\myscripts en una variable dentro mycmdlet.ps1.

Esta es una solución que funciona (aunque un poco engorrosa):

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'

Otro sugirió esta solución que solo funciona en nuestro entorno de prueba:

$settingspath = '.\settings.xml'

Me gusta mucho este último enfoque y prefiero que tenga que analizar el filepático como parámetro cada vez, pero no puedo hacer que funcione en mi entorno de desarrollo. ¿Qué debo hacer? ¿Tiene algo que ver con cómo se configura PowerShell?

¿Fue útil?

Solución

La forma confiable de hacer esto es como lo mostraste $MyInvocation.MyCommand.Path.

El uso de rutas relativas se basará en $ PWD, en PowerShell, el directorio actual para una aplicación o el directorio de trabajo actual para una API .NET.

PowerShell V3+:

Use la variable automática $PSScriptRoot.

Otros consejos

Sí, eso debería funcionar. Pero si necesita ver el camino absoluto, esto es todo lo que necesita:

(Get-Item -Path ".\").FullName

El método más fácil parece ser usar la siguiente variable predefinida:

 $PSScriptRoot

about_Automatic_Variables y about_Scripts Ambos estado:

En PowerShell 2.0, esta variable es válida solo en los módulos de script (.psm1). Comenzando en PowerShell 3.0, es válido en todos los scripts.

Lo uso así:

 $MyFileName = "data.txt"
 $filebase = Join-Path $PSScriptRoot $MyFileName

También puedes usar:

(Resolve-Path .\).Path

La parte en los soportes devuelve un PathInfo objeto.

(Disponible desde PowerShell 2.0.)

El camino a menudo es nulo. Esta función es más segura.

function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value;
    if($Invocation.PSScriptRoot)
    {
        $Invocation.PSScriptRoot;
    }
    Elseif($Invocation.MyCommand.Path)
    {
        Split-Path $Invocation.MyCommand.Path
    }
    else
    {
        $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
    }
}

Probar :

(Get-Location).path

o:

($pwd).path

Get-Location devolverá la ubicación actual:

$Currentlocation = Get-Location

me gusta la solución de una línea :)

$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

Prueba esto:

$WorkingDir = Convert-Path .

En PowerShell 3 y superior, simplemente puedes usar

$PSScriptRoot

Pensaría que usar '. ' Como la ruta significa que es la ruta de invocación. Pero no todo el tiempo. Ejemplo, si lo usa dentro de un scriptblock de trabajo. En cuyo caso, podría señalar %perfil % documentos.

Por lo que vale, para ser una solución de una sola línea, la siguiente es una solución de funcionamiento para mí.

$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)

El 1 al final es ignorar el /.

Gracias a las publicaciones de arriba usando el Recopilación cmdlet.

Para expandir la respuesta de @Cradle: también podrías escribir un función multipropósito Eso le dará el mismo resultado según la pregunta del OP:

Function Get-AbsolutePath {

    [CmdletBinding()]
    Param(
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true
        )]
        [String]$relativePath=".\"
    )

    if (Test-Path -Path $relativePath) {
        return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
    } else {
        Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
    }

}

Si solo necesita el nombre del directorio actual, puede hacer algo como esto:

((Get-Location) | Get-Item).Name

Suponiendo que está trabajando desde c: temp ubicación myworkingdirectory>

Producción

MyworkingDirectory

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top