Ubah direktori ke direktori sebelumnya di Powershell

31

Saya seorang pria Linux, tetapi saya mencoba untuk berpikiran terbuka dan belajar beberapa Powershell. Saya kehilangan kemampuan untuk cd -kembali ke direktori sebelumnya, seperti di shell * nix. Apakah ada perintah serupa di Powershell — perintah yang memungkinkan saya untuk kembali ke direktori saya sebelumnya?

Kazark
sumber
5
Jika Anda pushdingin menavigasi ke direktori baru, Anda bisa popdkembali ke yang sebelumnya. Ini bekerja di Bash, PowerShell dan bahkan baris perintah Windows sebelumnya.
Bob
1
Terkait (meskipun tidak bertanya tentang Windows, PowerShell atau yang setara langsung dari perintah ini, jadi bukan duplikat yang tepat): Bagaimana saya bisa berubah ke direktori sebelumnya alih-alih naik?
Bob

Jawaban:

19

Tidak persis dengan cara yang sama yang saya sadari. Salah satu opsi adalah menggunakan pushd bukan cd. Maka popd akan membawa Anda kembali.

Anda juga dapat mengubah profil Anda sehingga setiap kali muncul prompt baru (pada dasarnya setiap kali Anda menekan enter). Itu akan mendapatkan PWD dan membandingkannya dengan yang sebelumnya. Jika mereka berbeda, maka masukkan nilai itu ke tumpukan. Kemudian Anda akan memasukkan fungsi lain di profil Anda yang disebut sesuatu seperti cdb yang akan mengeluarkan item terakhir dari stack dan cd ke sana.

Ini terdengar seperti menyenangkan jadi saya datang dengan sebuah solusi. Masukkan semua kode ini ke profil Anda ( 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

Sekarang Anda dapat melakukan cd seperti biasa dan bd akan membawa Anda kembali ke lokasi dalam riwayat lokasi Anda.

EBGreen
sumber
11
Atau, Anda bisa saja alias cdke pushddan bdke popd: P
Bob
1
Saya memikirkan hal itu. Saya hanya lebih suka membuat metode baru untuk monyet dengan alias standar. Yang mana yang disukai tentu saja baik-baik saja. Itu akan menjadi mengapa saya disajikan sebagai sebuah solusi daripada yang solusi.
EBGreen
Saya memiliki pertanyaan yang sama persis seperti poster aslinya, dan akhirnya menempelkan definisi fungsi yang ditawarkan oleh @EBGreen.
nomadrc
3

Solusi cepat dan kotor adalah untuk alias cddan bdke pushddan popd. Batasannya adalah Anda tidak dapat melakukan hal yang sama cd -berulang kali.

Set-Alias -Name cd -Value pushd  -Option AllScope
Set-Alias -Name bd -Value popd  -Option AllScope
TankorSmash
sumber
3

Hanya mencoba cd -pada Powershell Core 6.2.2dan bekerja :)

cd - membawa Anda kembali ke riwayat lokasi Anda

cd + membawa Anda maju melalui riwayat lokasi Anda

th1rdey3
sumber
2

Saya telah memodifikasi skrip EBGreen yang hebat sehingga cd-akan selalu membawa Anda ke direktori sebelumnya alih-alih membalik-balik riwayat Anda . Dengan cara ini, menggunakan cd-beberapa kali akan beralih di antara dua direktori - yang cd -dilakukan di shell 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

Oh dan saya harus mengubah prompt-warna menjadi hijau :)

nitzel
sumber
0

Anda juga dapat mencari melalui histori perintah Anda dengan kontrol r, dan menemukan waktu sebelumnya Anda memasukkan perintah cd.

js2010
sumber
Itu akan bekerja untuk sebagian skenario. Karena saya cenderung bepergian dengan jalan relatif, itu tidak akan berhasil banyak waktu.
Kazark