Как выполнить текущий каталог командлета

StackOverflow https://stackoverflow.com/questions/8343767

  •  27-10-2019
  •  | 
  •  

Вопрос

Это должно быть простой задачей, но я видел несколько попыток о том, как пройти путь к каталогу, где выполненный командлет расположен со смешанным успехом. Например, когда я выполняю C:\temp\myscripts\mycmdlet.ps1 который имеет файл настроек на C:\temp\myscripts\settings.xml Я хотел бы иметь возможность хранить C:\temp\myscripts в переменной внутри mycmdlet.ps1.

Это одно решение, которое работает (хотя немного громоздко):

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

Другой предложил это решение, которое работает только в нашей тестовой среде:

$settingspath = '.\settings.xml'

Мне очень нравится последний подход, и я предпочитаю, чтобы он каждый раз анализировал FilePath как параметр, но я не могу заставить его работать в моей среде разработки. Что мне делать? Имеет ли это какое -то отношение к тому, как настроен PowerShell?

Это было полезно?

Решение

Надежный способ сделать это так же, как вы показали $MyInvocation.MyCommand.Path.

Использование относительных путей будет основано на $ pwd, в PowerShell, текущем каталоге для приложения или текущем рабочем каталоге для API .NET.

PowerShell V3+:

Используйте автоматическую переменную $PSScriptRoot.

Другие советы

Да, это должно работать. Но если вам нужно увидеть абсолютный путь, это все, что вам нужно:

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

Самый простой метод, по -видимому, состоит в том, чтобы использовать следующую предопределенную переменную:

 $PSScriptRoot

about_Automatic_Variables а также about_Scripts Оба штата:

В PowerShell 2.0 эта переменная действительна только в модулях сценариев (.psm1). Начиная с PowerShell 3.0, он действителен во всех сценариях.

Я использую это так:

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

Вы также можете использовать:

(Resolve-Path .\).Path

Часть в скобках возвращает PathInfo объект.

(Доступно с момента PowerShell 2.0.)

Путь часто нуль. Эта функция безопаснее.

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

Пытаться :

(Get-Location).path

или же:

($pwd).path

Get-Location вернет текущее местоположение:

$Currentlocation = Get-Location

Мне нравится однострочный раствор :)

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

Попробуй это:

$WorkingDir = Convert-Path .

В PowerShell 3 и выше вы можете просто использовать

$PSScriptRoot

Вы могли бы подумать, что использование '. ' Как путь означает, что это путь вызова. Но не все время. Пример, если вы используете его в сценарии работы. В этом случае это может указывать на %профиля % документы.

Для того, чтобы быть решением для одного линии, приведенное ниже-рабочее решение для меня.

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

1 в конце - игнорировать /.

Спасибо приведенным выше сообщениям, используя Получение Комдлет.

Чтобы расширить ответ @cradle: вы также можете написать Многоцелевая функция Это даст вам такой же результат по вопросу 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
    }

}

Если вам просто нужно имя текущего каталога, вы можете сделать что -то вроде этого:

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

Предполагая, что вы работаете с C: Temp Location MyWorkingDirectory>

Выход

MyWorkingDirectory

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top