Domanda

Questo dovrebbe essere un compito semplice, ma ho visto diversi tentativi su come ottenere il percorso della directory in cui il cmdlet eseguito si trova con alterne fortune. Per esempio, quando eseguo C:\temp\myscripts\mycmdlet.ps1 che ha un file di impostazioni in C:\temp\myscripts\settings.xml mi piacerebbe essere in grado di memorizzare C:\temp\myscripts in una variabile all'interno di mycmdlet.ps1.

Questa è una soluzione che funziona (anche se un po 'ingombrante):

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

Un altro ha suggerito questa soluzione che funziona solo sul nostro ambiente di test:

$settingspath = '.\settings.xml'

Mi piace il secondo approccio molto e preferisco a dover analizzare il percorso del file come parametro di volta in volta, ma non riesco a farlo funzionare sul mio ambiente di sviluppo. Cosa devo fare? Ha qualcosa a che fare con il modo in PowerShell è configurato?

È stato utile?

Soluzione

Il modo più affidabile per fare questo è proprio come hai fatto vedere $MyInvocation.MyCommand.Path.

Uso dei percorsi relativi si baserà su $ PWD, in PowerShell, la directory corrente per un'applicazione, o directory di lavoro corrente per un API .NET.

PowerShell v3 + :

Utilizzare la $PSScriptRoot variabile automatica.

Altri suggerimenti

Si, dovrebbe funzionare. Ma se avete bisogno di vedere il percorso assoluto, questo è tutto ciò che serve:

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

Il metodo più semplice sembra essere quella di utilizzare la seguente variabile predefinita:

 $PSScriptRoot

about_Automatic_Variables e about_Scripts sia stato:

In PowerShell 2.0, questa variabile è valida solo nei moduli di script (con estensione psm1). A partire dal PowerShell 3.0, è valida in tutti gli script.

Io lo uso in questo modo:

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

È inoltre possibile utilizzare:

(Resolve-Path .\).Path

La parte tra parentesi restituisce un PathInfo oggetto.

(Disponibile dal PowerShell 2.0.)

Path è spesso nullo. Questa funzione è più sicuro.

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("\"));
    }
}

Prova:

(Get-Location).path

o

($pwd).path

Get-Location restituirà la posizione corrente:

$Currentlocation = Get-Location

l'uno-solution line :)

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

Prova questo:

$WorkingDir = Convert-Path .

in PowerShell 3 e, soprattutto, si può semplicemente utilizzare

$PSScriptRoot

Si potrebbe pensare che l'uso '\' come mezzo di percorso che è il percorso di invocazione. Ma non sempre. Esempio, se lo si utilizza all'interno di un lavoro ScriptBlock. In questo caso, si potrebbe puntare a% profilo% \ Documents.

Per quel che vale, per essere una soluzione single-line, il sotto è una soluzione di lavoro per me.

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

Il 1 alla fine è ignorare il /.

Grazie ai posti di cui sopra utilizzando il Get-Location cmdlet.

Se avete solo bisogno il nome della directory corrente, si potrebbe fare qualcosa di simile:

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

Supponendo che si sta lavorando da C: \ Temp \ Località \ MyWorkingDirectory>

Output

MyWorkingDirectory

scroll top