Como Dividir Caminhos com o Cmdlet Split-Path do PowerShell

Precisas de dividir caminhos para obter partes específicas dele? Se sim, então o Split-Path do PowerShell é o amigo em que podes confiar. Quando trabalhas com ficheiros, certificados e o registo, vais notar que os caminhos representam as suas localizações.

E, em algum momento, talvez precises de filtrar qual parte de um caminho retornar, talvez ao fazer automatização. Com sorte para ti, este tutorial vai-te ensinar maneiras de usar o cmdlet Split-Path do PowerShell para o fazer.

Vamos lá! Continua a ler e vamos arranjar-te uma nova arma para o teu arsenal do PowerShell!

Pré-requisitos

Se planeias acompanhar os exemplos deste tutorial prático, vais precisar de um computador a correr qualquer versão moderna do Windows que tenha o PowerShell 5.1 ou superior. Este tutorial estará a usar o Windows 10 20H2 com o PowerShell 7.1.1.

O que é um Caminho?

Antes de mergulhar profundamente no cmdlet Split-Path do PowerShell, certifiquemo-nos de que estás claro sobre o que é um caminho. Um caminho determina a localização de um item que segue um formato específico.

Por exemplo, o caminho de um ficheiro poderia ser C:\demo\subfolder1\TestFile_11.txt. Se separares este caminho em partes, o caminho inclui o seguinte:

  • C: is the drive or the qualifier, or the specified path. The qualifier is the part of the path from the left up to the colon (:) character.
  • \demo\subfolder1\ é a pasta e subpasta(s) ou contentores.
  • TestFile_11.txt é o nome do ficheiro ou a folha. A folha é o último elemento ou parte de um caminho.

Lembre-se, no entanto, que os caminhos não são exclusivos para arquivos e pastas. Outros caminhos válidos podem incluir:

  • Certificado (por exemplo, Cert:\CurrentUser\My)
  • Registro (por exemplo, HKCU:\Software)
  • Função (por exemplo, Function:\New-Guid)
  • Variável (por exemplo, Variable:\PSEdition)
  • Active Directory (por exemplo, AD:\CN=Users,DC=Constoso,DC=com)

Os Parâmetros do PowerShell Split-Path

Como qualquer cmdlet, Split-Path vem com um conjunto de parâmetros que manipulam como o cmdlet se comporta e retorna sua saída. E esses parâmetros são o que compõe a sintaxe do Split-Path no PowerShell.

  • -Path – Este parâmetro aceita uma ou mais strings de caminho que você deseja dividir. Este parâmetro também aceita entrada de pipeline. Curetos em caminhos também são aceitáveis.
  • -LiteralPath – Assim como o parâmetro -Path, o parâmetro -LiteralPath também aceita caminhos para dividir. Mas este parâmetro tratará o caminho apenas como está escrito. Ou seja, o comando não interpretará curetos se você usar este parâmetro para especificar caminhos.
  • -Resolve – Este parâmetro indica ao cmdlet Split-Path para resolver os arquivos ou itens referenciados pelo caminho fornecido. Devido à sua natureza literal, você não pode usar este parâmetro junto com o parâmetro -LiteralPath.
  • -IsAbsolute – Este parâmetro retorna um valor booleano para determinar se o caminho que você especificou é um caminho absoluto ou não.

O cmdlet PowerShell Split-Path também possui um parâmetro chamado -Credential, que supostamente aceita um objeto de credencial PSCredential. Mas, de acordo com a Microsoft, esse parâmetro não é suportado por nenhum dos provedores PowerShell padrão e gera um erro quando você o utiliza.

Os seguintes parâmetros são chamados de Parâmetros de Localização Dividida. Esses parâmetros informam ao cmdlet PowerShell Split-Path qual elemento ou parte de um caminho retornar. Como o cmdlet só pode retornar um elemento de um caminho, você só pode usar um desses parâmetros por vez.

  • -Parent – Retorna a localização pai (sem o item ou nome do arquivo) do caminho que você especificou. Este parâmetro também é o parâmetro de localização dividida padrão, o que significa que você pode omitir este parâmetro e ainda obter a localização pai como resultado.
  • -Leaf – Retorna apenas o último elemento do caminho ou a folha.
  • -LeafBase – Retorna apenas o último elemento do caminho ou a folha sem a extensão. Este parâmetro está disponível apenas no PowerShell 6.0 e superior.
  • -Extension – Retorna apenas a extensão da folha (do último ponto “.” até o último caractere do caminho). Este parâmetro está disponível apenas no PowerShell 6.0 e superior.
  • -Qualifier – Retorna apenas a unidade ou o qualificador do caminho.
  • -NoQualifier – Remove a unidade ou o qualificador do restante do caminho.

Usando o Cmdlet Split-Path do PowerShell (Exemplos)

O cmdlet Split-Path do PowerShell permite dividir e dissecar partes de um caminho. Após fazer isso, você pode especificar qual parte de um caminho retornar. Dependendo dos requisitos de saída, você pode optar por retornar o qualificador, o caminho sem um qualificador e o(s) nome(s) do arquivo.

Obtendo a Pasta Pai de um Caminho

Para retornar a pasta pai do caminho, execute o cmdlet Split-Path do PowerShell e anexe o parâmetro -Parent.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Parent

O resultado abaixo mostra que o comando retorna o caminho da pasta pai.

Returning the parent containers of the Item

Dica: Executar o cmdlet Split-Path do PowerShell sem parâmetros retornará a pasta pai por padrão, o mesmo comportamento ao usar o parâmetro -Parent.

Dica: O parâmetro -Path aceita vários caminhos, permitindo dividir valores de string de vários caminhos em um único comando.

e.g., Split-Path -Path 'c:\folder1','c:\folder2'

Exibindo um Caminho Sem o Qualificador

Imagine que você está criando um script que duplica a estrutura de árvore de pastas de uma unidade para outra (por exemplo, C:\demo\subfolder1 para D:\demo\subfolder1). Você pode querer que seu código divida o caminho de origem e obtenha apenas a estrutura de pastas sem a letra da unidade.

Para obter o caminho sem o qualificador, execute o cmdlet Split-Path do PowerShell com o parâmetro -NoQualifier como o comando abaixo. Este comando divide o caminho enquanto omite a letra da unidade no resultado.

Split-Path -Path C:\demo\subfolder1 -NoQualifier

Como você pode ver no resultado abaixo, usando o parâmetro noQualifier retorna o caminho, mas sem a string do qualificador.

Returning the Path Without the Qualifier

Obtendo a Unidade ou Qualificador de um Caminho

Pode haver momentos em que você precisa retornar o qualificador ou a letra da unidade apenas. Por exemplo, quando você deseja que seu script resuma os resultados com base nas letras das unidades.

E para fazer isso, execute o comando Split-Path do PowerShell abaixo com o parâmetro -Qualifier. Este comando dividirá o caminho e retornará apenas a string do qualificador como resultado.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Qualifier
Returning the Path’s Drive or Qualifier

Exibindo o Nome de um Arquivo, Diretório ou Item

Pense em um caminho como uma árvore. O qualificador é a própria árvore, as pastas são os galhos e, no final, você encontrará a folha. Uma folha é qualquer string de comprimento não nulo no final do caminho.

Quando você precisa dividir um caminho para obter a folha, execute o comando Split-Path abaixo e anexe o parâmetro -Leaf.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Leaf

Como resultado, a imagem abaixo mostra que o comando retornou apenas o nome do arquivo do caminho que você especificou.

Returning the Path’s Leaf

Dividindo o Nome do Arquivo e a Extensão (≥PowerShell 6.0)

Nota: Esta seção se aplica ao PowerShell 6.0 e versões posteriores.

Então, você dividiu o caminho e obteve o item. E o item, neste caso, é um nome de arquivo (TestFile_11.txt), que tem duas partes – a base e a extensão. O cmdlet Split-Path do PowerShell permite que você divida ainda mais o último em essas duas partes com os parâmetros -LeafBase e -Extension.

Para obter a base e a extensão de um nome de arquivo, execute os comandos abaixo.

Se o caminho não tiver uma extensão, o parâmetro Extension retornará uma string vazia.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -LeafBase
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Extension
Splitting the Leaf’s Base and Extension

Dividindo o Nome do Arquivo e a Extensão (≤ Windows PowerShell 5.1)

Infelizmente, os parâmetros -LeafBase e -Extension não estão disponíveis no Windows PowerShell 5.1 e versões inferiores. Não se preocupe, no entanto, com um pouco de magia do PowerShell, você pode replicar a saída desses parâmetros mesmo se tiver apenas o Windows PowerShell 5.1.

Mas em vez do cmdlet Split-Path, você usará a próxima melhor opção – a combinação do método split() e do operador -replace.

A PowerShell string object, such as the path, contains a split() method. This method allows you to split a string into multiple elements based on a delimiter character that you provide. And in the case of paths, the delimiter is the (\\) back-slash character.

Por outro lado, o operador -replace permite substituir strings usando expressões regulares (RegEx).

Para imitar os resultados do parâmetro -LeafBase, execute o comando abaixo no PowerShell.

# Divida o caminho ('C:\demo\subfolder1\TestFile_11.txt') usando '\' como delimitador.
# Selecione o último elemento '[-1]' após a divisão (TestFile_11.txt)
# Procure a string que corresponda a este padrão --> '\.[^.]*$'
# ^ este padrão corresponderá ao último ponto "." no caminho E a todos os outros caracteres após ele.
# Em seguida, substitua a correspondência por nada/valor vazio ''.
('C:\demo\subfolder1\TestFile_11.txt').split('\')[-1] -replace '\.[^.]*$',''

Como resultado, a captura de tela abaixo mostra que o comando retornou apenas o nome base do arquivo.

Getting the file base in PowerShell 5.1

Agora, para obter apenas a extensão do arquivo, execute o comando abaixo no PowerShell.

# Divida o caminho ('C:\demo\subfolder1\TestFile_11.txt') usando '.' como delimitador.
# Selecione o último elemento '[-1]' após a divisão (txt)
('C:\demo\subfolder1\TestFile_11.txt').split('.')[-1]

O resultado abaixo mostra que o comando retornou apenas a extensão do arquivo – txt.

Getting the file extension in PowerShell ≤ 5.1

Determinando se o Caminho é Absoluto

Como administrador do sistema, você encontrará dois tipos de caminho—absoluto e relativo. Mas qual é a diferença? Um caminho absoluto começa com um qualificador, como C:\demo ou HKCU:\Software. Em contraste, um caminho relativo não possui um qualificador, como .\demo ou \folder1\folder2.

O cmdlet Split-Path do PowerShell pode ajudá-lo a identificar um caminho absoluto usando o parâmetro -IsAbsolute. Para fazer isso, execute os comandos abaixo para determinar se o caminho é absoluto.

# Este caminho é absoluto
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -IsAbsolute
# Este caminho é relativo
Split-Path -Path .\demo\subfolder1\TestFile_11.txt -IsAbsolute

Como você pode ver abaixo, o parâmetro -isAbsolute retorna um valor booleano para indicar se o caminho é absoluto (TRUE) ou relativo (FALSE).

Determining if the Path is Absolute

Dividindo e Resolvendo Caminhos com Curetas

Até este ponto, os caminhos que você divide com o cmdlet Split-Path não precisam ser existentes. Se um caminho existe ou não, este cmdlet irá dividi-lo e fornecer o resultado.

Mas o cmdlet Split-Path do PowerShell tem outro parâmetro chamado -Resolve. Este parâmetro permite que você resolva os itens referenciados por curetas. E se você usar este parâmetro, o caminho que você irá dividir e os itens dentro dele devem existir previamente.

Por exemplo, para retornar os itens que correspondem à extensão de arquivo *.txt, execute o comando abaixo. O parâmetro -Leaf garante que o cmdlet retorne apenas os itens e não os contêineres pai.

O (*) curinga representa um ou mais caracteres a serem correspondidos, enquanto (?) representa um curinga de um único caractere.

Split-Path -Path C:\demo\subfolder1\*.txt -Leaf -Resolve

O resultado abaixo lista os arquivos TestFile_11.txt até TestFile_20.txt. Esses arquivos todos correspondiam à extensão de nome de arquivo .txt.

Resolving matching filenames

Para resolver uma correspondência de caractere única, substitua o caractere asterisco (\*) wildcard pelo caractere de ponto de interrogação (\?) como o comando abaixo.

Split-Path -Path C:\demo\subfolder1\TestFile_2?.txt -Resolve -Leaf

A saída abaixo mostra apenas o arquivo TestFile_20.txt porque este arquivo é o único que correspondeu.

Resolving matching single character

Se o caminho contiver um caractere de escape, como o acento grave (“`), coloque o caminho entre aspas simples para resolver o caminho. Por exemplo, o comando abaixo divide e resolve um caminho contendo um caractere de escape.

Split-Path -Path 'C:\demo\subfolder1\dir`n\TestFile_2?.txt' -Leaf -Resolve
Splitting and Resolving a Path with Escape Characters

Como prova de conceito, se você não incluir esse caminho entre aspas simples, o comando retornará um erro informando que o caminho não existe. O mesmo erro ocorre se você usar aspas duplas em vez disso.

Split-Path -Path C:\demo\subfolder1\dir`n\TestFile_2?.txt -Leaf -Resolve
Split-Path -Path "C:\demo\subfolder1\dir`n\TestFile_2?.txt" -Leaf -Resolve
Resolving a Path without enclosing single quotation marks

Conclusão

O cmdlet PowerShell Split-Path é uma ferramenta indispensável para administradores de sistemas e usuários em geral. Este tutorial teve como objetivo ensinar como o cmdlet Split-Path pode dividir qualquer caminho fornecido e retornar elementos específicos com base no parâmetro que você usa.

Você já usou o Split-Path em suas tarefas antes? Se não, este tutorial o convenceu a usá-lo em seus trabalhos manuais ou de automação? Ou você conhece outra maneira de dividir caminhos melhor do que o Split-Path do PowerShell?

Source:
https://adamtheautomator.com/powershell-split-path/