Zmień katalog na poprzedni katalog w PowerShell

31

Jestem facetem z Linuksa, ale staram się być otwarty i uczyć się PowerShell. Brakuje mi możliwości cd -powrotu do poprzedniego katalogu, na przykład w powłokach * nix. Czy w Powershell jest podobne polecenie, które pozwoliłoby mi wrócić do poprzedniego katalogu?

Kazark
źródło
5
Jeśli miałbyś użyć pushddo przejścia do nowego katalogu, możesz popdwrócić do poprzedniego. Działa to w Bash, PowerShell, a nawet w starszej linii poleceń Windows.
Bob
1
Powiązane (choć nie pyta o Windows, PowerShell lub bezpośredni odpowiednik tego polecenia, więc nie jest to dokładny duplikat): Jak mogę przejść do poprzedniego katalogu zamiast iść w górę?
Bob

Odpowiedzi:

19

Nie dokładnie w ten sam sposób, o jakim jestem świadomy. Jedną z opcji jest użycie pushd zamiast cd. Wtedy Popd zabierze Cię z powrotem.

Możesz także zmienić swój profil, aby pojawiał się nowy monit (w zasadzie po naciśnięciu klawisza Enter). Dostałby PWD i porównałby go z poprzednim. Jeśli są różne, umieść tę wartość na stosie. Następnie dołączasz do swojego profilu inną funkcję o nazwie cdb, która zrywa ostatni element ze stosu i zapisuje na nim cd.

To brzmiało jak zabawy, więc wpadłem na rozwiązanie. Umieść cały ten kod w swoim profilu ( about_Profiles ).

[System.Collections.Stack]$GLOBAL:dirStack = @()
$GLOBAL:oldDir = ''
$GLOBAL:addToStack = $true
function prompt
{
    Write-Host "PS $(get-location)>"  -NoNewLine -foregroundcolor Magenta
    $GLOBAL:nowPath = (Get-Location).Path
    if(($nowPath -ne $oldDir) -AND $GLOBAL:addToStack){
        $GLOBAL:dirStack.Push($oldDir)
        $GLOBAL:oldDir = $nowPath
    }
    $GLOBAL:AddToStack = $true
    return ' '
}
function BackOneDir{
    $lastDir = $GLOBAL:dirStack.Pop()
    $GLOBAL:addToStack = $false
    cd $lastDir
}
Set-Alias bd BackOneDir

Teraz możesz cd tak jak normalnie, a bd zabierze Cię z powrotem do lokalizacji w historii lokalizacji.

EBGreen
źródło
11
Albo ty mógł tylko alias cddo pushdi bddo popd: P
Bob
1
Myślałem o tym. Po prostu wolę stworzyć nową metodę niż małpować ze standardowym aliasem. To, co jest preferowane, jest oczywiście w porządku. To byłoby dlaczego przedstawiła go jako w roztworze niż w roztworze.
EBGreen
Miałem dokładnie to samo zapytanie co oryginalny plakat i ostatecznie wkleiłem definicje funkcji oferowane przez @EBGreen.
nomadrc
3

Szybki i brudny rozwiązaniem jest alias cdi bddo pushda popd. Ograniczeniem jest to, że nie możesz robić tyle samo, co w cd -kółko.

Set-Alias -Name cd -Value pushd  -Option AllScope
Set-Alias -Name bd -Value popd  -Option AllScope
TankorSmash
źródło
3

Po prostu próbowałem cd -na Powershell Core 6.2.2i to działa :)

cd - zabierze Cię z powrotem do historii lokalizacji

cd + poprowadzi Cię do przodu przez historię lokalizacji

th1rdey3
źródło
2

Zmodyfikowałem świetny skrypt EBGreen, dzięki czemu cd-zawsze zabierze Cię do poprzedniego katalogu zamiast cofania historii . W ten sposób cd-wielokrotne użycie spowoduje przełączanie między dwoma katalogami - co cd -dzieje się w powłokach uniksowych.

$GLOBAL:previousDir = ''
$GLOBAL:currentDir = ''
function prompt
{
    Write-Host "PS $(get-location)>"  -NoNewLine -foregroundcolor Green
    $GLOBAL:nowPath = (Get-Location).Path
    if($nowPath -ne $GLOBAL:currentDir){
        $GLOBAL:previousDir = $GLOBAL:currentDir
        $GLOBAL:currentDir = $nowPath
    }
    return ' '
}
function BackOneDir{
    cd $GLOBAL:previousDir
}
Set-Alias cd- BackOneDir

No i musiałem zmienić kolor zachęty na zielony :)

Nitzel
źródło
0

Możesz także przeszukiwać historię poleceń za pomocą kontrolki r i znaleźć poprzedni czas wprowadzenia polecenia cd.

js2010
źródło
To działałoby w przypadku podzbioru scenariuszy. Ponieważ zazwyczaj podróżuję po ścieżkach względnych, nie będzie to często działać.
Kazark,