Изменить каталог на предыдущий каталог в Powershell

31

Я парень из Linux, но пытаюсь быть непредубежденным и изучать немного Powershell. Мне не хватает возможности cd -вернуться к предыдущему каталогу, как в * nix оболочках. Есть ли в Powershell аналогичная команда, которая позволила бы мне вернуться в мой предыдущий каталог?

Kazark
источник
5
Если вам нужно было pushdперейти к новому каталогу, вы можете popdвернуться к предыдущему. Это работает в Bash, PowerShell и даже в устаревшей командной строке Windows.
Боб
1
Связанный (хотя и не спрашивающий о Windows, PowerShell или прямом эквиваленте этой команды, поэтому не является точным дубликатом): Как я могу перейти к предыдущему каталогу вместо того, чтобы идти вверх?
Боб

Ответы:

19

Не совсем так, как я знаю. Один из вариантов - использовать pushd вместо cd. Тогда popd вернет вас обратно.

Вы также можете изменить свой профиль, чтобы каждый раз, когда появлялось новое приглашение (в основном, когда вы нажимаете Enter). Было бы получить PWD и сравнить это с предыдущим. Если они разные, поместите это значение в стек. Затем вы бы включили в свой профиль другую функцию, которая называется что-то вроде cdb, которая вытолкнула бы последний элемент из стека и cd в него.

Это звучало как весело , так что я придумал в растворе. Поместите весь этот код в свой профиль ( 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

Теперь вы можете использовать CD так же, как обычно, и BD вернет вас обратно в историю вашего местоположения.

EBGreen
источник
11
Или вы могли бы просто псевдоним , cdчтобы pushdи bdк popd: P
Bob
1
Я думала об этом. Я просто предпочитаю делать новый метод обезьяне со стандартным псевдонимом. Что бы ни было предпочтительным, это, конечно, хорошо. Это было бы , почему я представил его как в растворе , а не в растворе.
EBGreen
У меня был точно такой же запрос, что и у оригинального постера, и я в итоге вставил определения функций, предлагаемые @EBGreen.
nomadrc
3

Быстрое и грязное решение заключается в псевдониме cdи bdк pushdи popd. Ограничением является то, что вы не можете делать эквивалент cd -снова и снова.

Set-Alias -Name cd -Value pushd  -Option AllScope
Set-Alias -Name bd -Value popd  -Option AllScope
TankorSmash
источник
3

Только что попробовал cd -на Powershell Core 6.2.2и это работает :)

cd - возвращает вас через историю вашего местоположения

cd + перенесет вас вперед через историю вашего местоположения

th1rdey3
источник
2

Я изменил замечательный скрипт EBGreen, чтобы cd-он всегда переместил вас в ваш предыдущий каталог, а не перевернул историю . Таким образом, использование cd-нескольких раз будет переключать между двумя каталогами - это то, что cd -делает на оболочках Unix.

$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

Ох, и мне пришлось изменить цвет подсказки на зеленый :)

nitzel
источник
0

Вы также можете выполнить поиск в истории команд с помощью элемента управления r и найти предыдущий раз, когда вы вводили команду cd.

js2010
источник
Это будет работать для подмножества сценариев. Поскольку я склонен путешествовать с относительными путями, это не будет работать большую часть времени.
Казарк