Existem muitas "operações/atividades" que por diversos motivos são executadas uma vez e outra repetidamente. Quando detecto alguma desta situações tento, se for possível, otimizar essa tarefa para conseguir que se possa executar de uma forma mais fácil e rápida. Uma das situações que diariamente me acontecem em windows é numa sessão powershell ou cmd ter que mudar de localização em termos de pastas e deslocar-me para pastas em caminhos complexos ou seja mudar para "c:\aquela\pasta\que\esta\no\fim\do\mundo" a partir da localização atual. Estar a fazer o "cd " com o caminho pretendido, seja passando pasta a pasta quer seja completo pela utilização do "TAB" acaba sempre por ser uma tarefa entediante.
Claro que podemos criar um script para cada caminho se for um caminho que vamos visitar frequentemente... mas isso depois acaba por ser alguma quantidade de scripts se tivermos muitas pastas para onde temos que ir de forma recorrente...
Tentei encontrar para Windows o equivalente ao "goto" que existe em Linux como programa ou inúmeros "shell scripts". Talvez tenha não tenha pesquisado da melhor forma mas não encontrei nada simples para windows (no caso, "powershell" ou "cmd")... Então resolvi pensar em possíveis soluções:
- fazer um programa executável com uma linguagem de programação em que me sentisse á vontade
- fazer um script "powershell" ou "cmd"
Optei por esta última opção por me parecer a mais rápida apesar de não dominar fluentemente as funcionalidades do "powershell" (não tentei para "cmd"). Depois de alguma pesquisa e trabalho cheguei ao seguinte script que:
- permite guardar um ou mais "alias" da nossa escolha que apontam para um determinado caminho
- permite saltar para este caminho utilizando o "alias"
- permite listar os "alias" armazenados
- permite eliminar um determinado "alias"
# recolhe a pasta inicial do utilizador
$configPath = Join-Path -Path $env:USERPROFILE -ChildPath ".goto.ini"
function Load-Aliases {
# verifica se ficheiro de dados existe
if (-not (Test-Path -Path $configPath)) {
return @{}
}
# lê ficheiro de dados
$aliases = @{}
Get-Content -Path $configPath | ForEach-Object {
if ($_ -match "^(.+)=(.+)$") {
$aliases[$Matches[1]] = $Matches[2]
}
}
return $aliases
}
function Save-Aliases ($aliases) {
# Guarda alias no ficheiro de dados
$aliases.Keys | ForEach-Object {
"$=$($aliases[$])"
} | Out-File -Path $configPath -Encoding utf8
}
verifica argumentos
if ($args.Count -eq 0) {
Write-Host "Utilização: g [alias] | /a [caminho ou .] [alias] | /r [alias] | /l"
Write-Host " [alias] : muda para a pasta associada ao alias"
Write-Host " /a [caminho ou .] [alias] : adiciona um novo alias"
Write-Host " /r [alias] : remove um alias existente"
Write-Host " /l : lista todos os aliases armazenados"
Write-Host " Nota : usar '.' considera pasta atual"
exit
}
$aliases = Load-Aliases
$command = $args[0]
switch ($command) {
"/a" {
if ($args.Count -ne 3) {
Write-Host "Utilização para adicionar um alias : g /a [caminho ou .] [alias]"
exit
}
$path = $args[1]
$alias = $args[2]
# verifica diretoria corrente
if ($path -eq ".") {
$path = (Get-Location).Path
}
# verifica se o caminho indicado existe
if (-not (Test-Path -Path $path -PathType Container)) {
Write-Host "Erro: Caminho '$path' não existe."
exit
}
$aliases[$alias] = $path
Save-Aliases $aliases
Write-Host "Alias '$alias' adicionado com sucesso para o caminho '$path'."
}
"/r" {
if ($args.Count -ne 2) {
Write-Host "Utilização para remover um alias : g /r [alias]"
exit
}
$alias = $args[1]
# Verifica se alias existe
if ($aliases.ContainsKey($alias)) {
$aliases.Remove($alias)
Save-Aliases $aliases
Write-Host "Alias '$alias' removido com sucesso."
} else {
Write-Host "Erro: Alias '$alias' não encontrado."
}
}
"/l" {
if ($aliases.Count -eq 0) {
Write-Host "Nenhum alias armazenado."
} else {
Write-Host "Alias armazenados:"
Write-Host "---------------------"
$aliases.GetEnumerator() | Sort-Object Name | ForEach-Object {
Write-Host "$($_.Name) -> $($_.Value)"
}
}
}
default {
$alias = $command
if ($aliases.ContainsKey($alias)) {
$path = $aliases[$alias]
if (Test-Path -Path $path -PathType Container) {
Set-Location -Path $path
Write-Host "Consegui mudar para '$path'."
} else {
Write-Host "Erro: A pasta do alias '$alias' já não existe. Por favor apague o alias."
}
} else {
Write-Host "Erro: Alias '$alias' não encontrado."
}
}
}
Este script cria um ficheiro ".goto.ini" na "home" que irá armazenar os "alias" e caminhos associados. Com a utilização deste ficheiro consegue fazer as operações acima referidas. Se for eliminado os alias armazenados desaparecem.
Para não ter que escrever muito - no fundo é o objetivo deste script - resolvi chamar "g" de "goto" a este script. Assim, basta copiar o código acima para dentro de um ficheiro texto a que vamos chamar "g.ps1" e colocar em qualquer pasta que esteja na variável de ambiente "PATH" (pessoalmente tenho uma pasta no "path" que armazena este tipo de utilitários para estarem sempre á mão).
A forma de utilizar está explicita no próprio código mas a título de exemplo se estivermos em
c:\aquela\pasta\que\esta\no\fim\do\mundo>
e escrevermos
c:\aquela\pasta\que\esta\no\fim\do\mundo> g /a . abc
ou ainda estando noutro local
c:\> g /a c:\aquela\pasta\que\esta\no\fim\do\mundo abc
na próxima vez, estejamos onde estivermos basta fazer
c:\> g abc
que iremos para o caminho associado ao alias utilizado.
Espero que este script vos possa ser útil como o é para mim!
Nota: só funciona em consola/terminal "powershell"! Caminhos com espaços devem ficar entre aspas tipo "c:\aquela\pasta\que\esta\no\fim\do\mundo e arredores" . Se já nos encontrarmos na pasta em questão e utilizarmos o "." o script trata desta particularidade por nós.