Как нормализовать путь в PowerShell?

Java 1.7 значительно облегчает нашу жизнь благодаря запросу try-with-resources .

try (Connection connection = dataSource.getConnection();
    Statement statement = connection.createStatement()) {
    try (ResultSet resultSet = statement.executeQuery("some query")) {
        // Do stuff with the result set.
    }
    try (ResultSet resultSet = statement.executeQuery("some query")) {
        // Do more stuff with the second result set.
    }
}

Этот синтаксис довольно короткий и изящный. И connection действительно будет закрыт, даже когда невозможно создать statement.

83
задан dan-gph 30 January 2009 в 14:15
поделиться

6 ответов

Можно расшириться..\frag до его полного пути с путем твердости:

PS > resolve-path ..\frag 

Попытка нормализовать путь с помощью объединения () метод:

[io.path]::Combine("fred\frog",(resolve-path ..\frag).path)
98
ответ дан abatishchev 5 November 2019 в 16:31
поделиться

Вы могли также использовать Путь. GetFullPath, хотя (как с ответом R Dan) это даст Вам весь путь. Использование было бы следующие:

[IO.Path]::GetFullPath( "fred\frog\..\frag" )

или более интересно

[IO.Path]::GetFullPath( (join-path "fred\frog" "..\frag") )

, оба из которых приводят к следующему (принимающий Ваш текущий каталог D:\):

D:\fred\frag

Примечание, которое этот метод не пытается определить или fred или frag на самом деле, существует.

23
ответ дан Charlie 5 November 2019 в 16:31
поделиться

Эта библиотека хороша: NDepend. Помощники. FileDirectoryPath.

РЕДАКТИРОВАНИЕ: Это - то, что я придумал:

[Reflection.Assembly]::LoadFrom("path\to\NDepend.Helpers.FileDirectoryPath.dll") | out-null

Function NormalizePath ($path)
{
    if (-not $path.StartsWith('.\'))  # FilePathRelative requires relative paths to begin with '.'
    {
        $path = ".\$path"
    }

    if ($path -eq '.\.')  # FilePathRelative can't deal with this case
    {
        $result = '.'
    }
    else
    {
        $relPath = New-Object NDepend.Helpers.FileDirectoryPath.FilePathRelative($path)
        $result = $relPath.Path
    }

    if ($result.StartsWith('.\')) # remove '.\'. 
    {
        $result = $result.SubString(2)
    }

    $result
}

Вызов это как это:

> NormalizePath "fred\frog\..\frag"
fred\frag

Примечание, что этот отрывок требует пути к DLL. Существует прием, который можно использовать для нахождения папки, содержащей в настоящее время выполняющийся сценарий, но в моем случае у меня была переменная среды, которую я мог использовать, таким образом, я просто использовал это.

3
ответ дан dan-gph 5 November 2019 в 16:31
поделиться

Это дает полный путь:

(gci 'fred\frog\..\frag').FullName

Это дает путь относительно текущего каталога:

(gci 'fred\frog\..\frag').FullName.Replace((gl).Path + '\', '')

По некоторым причинам они только работают, если frag файл, не directory.

1
ответ дан dan-gph 5 November 2019 в 16:31
поделиться

Ну, один путь был бы:

Join-Path 'fred\frog' '..\frag'.Replace('..', '')

Ожидают, возможно, я неправильно понимаю вопрос. В Вашем примере действительно ли frag является подпапкой лягушки?

0
ответ дан EBGreen 5 November 2019 в 16:31
поделиться

Если необходимо избавиться от.. часть, можно использовать Систему. Объект IO.DirectoryInfo. Используйте 'fred\frog..\frag' в конструкторе. Свойство FullName даст Вам нормализованное имя каталога.

единственный недостаток состоит в том, что это даст Вам весь путь (например, c:\test\fred\frag).

0
ответ дан Dan R 5 November 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: