Come ottenere la directory corrente del cmdlet in esecuzione
-
27-10-2019 - |
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?
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
$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.
Per espandere sulla risposta @Cradle s': si potrebbe anche scrivere un href="http://bit.ly/1QdZDgD" rel="nofollow"> funzione di multi-purpose che ti porterà lo stesso risultato per ogni domanda del PO:
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
}
}
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