windows - Hvordan manipulerer jeg PowerShells placeringsstabel med en lignende swapoperation?

Indlæg af Hanne Mølgaard Plasc

Problem



I PowerShell kan du bruge pushd (et alias for Push-Location og popd (et alias for Pop-Location) at skubbe elementer på og pope elementer væk fra en positionsstabel.


Dette ligner meget bash s s pushd og popd funktionalitet for en stak af mapper.


Men et andet godt træk ved bash er, at du kan bruge pushd alt for sig selv til at bytte de to øverste steder på stakken. Så du kan vende frem og tilbage meget hurtigt mellem et sted og et andet. Og det tager også et argument som pushd +3, så du kan bytte med et sted, der er et par elementer ned i din stack.


Er der nogen måde at gøre med PowerShell?


Som et eksempel, i bash:




$ pwd
/bin
$ pushd ~
~ /bin
$ pwd
/home/hopper
$ pushd
/bin ~
$ pwd
/bin
$ pushd
~ /bin
$ pwd
/home/hopper

Bedste reference


Der har været lignende funktionalitet indbygget i PowerShell Community Extensions i årevis :-) for eksempel: [31]


48 >  cd C:inetpub
C:inetpub
49 >  cd C:WindowsSystem32
C:WindowsSystem32
50 >  cd -
C:inetpub
51 >  cd +
C:WindowsSystem32
52 >  cd

     # Directory Stack:
   --- ----------------
     0 C:UsersKeith
     1 C:inetpub
->   2 C:WindowsSystem32

53 >  cd -0
C:UsersKeith


Selvom det ikke er en bytte, er den bageste (-) og fremad (+) metafor ret veletableret i disse dage. Og du går over til et hvilket som helst sted i placeringshistorikken ved at angive -<num>. Faktisk og dette var en meget praktisk tilføjelse foreslået af en PSCX bruger, du kan cd til en fil fil (som bare cd'er til dir filen er i) fx:


cd $profile


For at aktivere denne funktionalitet i PSCX skal du angive filen Pscx.UserPreference.ps1, når du importerer modulet f.eks .:


Import-Module PSCX -arg ~Pscx.UserPreferences.ps1


I dette tilfælde kopierer jeg filen fra PSCX dir til mit hjem dir og ændrer mig efter min smag. For mere information, udfør:


cd -?


eller


man cd -full


Den fulde kilde til dette indlejrede modul er her (på CodePlex). [32]

Andre referencer 1


Du kan få adgang til din stack ved hjælp af Get-Location med -Stack -knappen. Som karakter af en stak er det LIFO. Get-Location -Stack opretter en System.Management.Automation.PathInfoStack objekt, så du kan få adgang til individuelle stakemner som denne:



  • $stack.ToArray()[-1]: Får den første skubbet vare.

  • $stack.ToArray()[0]: Får den sidste skubbet vare. Samme som $stack.Peek().



Så svaret er, at der ikke er indbygget switch til Push-Location for at ændre din stackordre, men du kan oprette en funktion til at gøre dette. Bemærk, at dette manipulerer standardstakken. Som navnet antyder kan du oprette dine egne stakke ved hjælp af Push-Location -StackName MyStack. Du kan endda ændre standardstakken til din brugerdefinerede stabel ved hjælp af Set-Location -StackName MyStack.


Jeg fandt ikke en måde at indstille stakkeobjektet på uden at bruge Pop/Push cmdlets. Så jeg var nødt til at gennemføre dette på en måde, der er vanskeligere end hvis jeg kunne ... men her er en lille funktion, der tillader dig at bytte de to øverste stier i stakken.


function Swap-StackTop {
    param ($StackName = "default")
    $origPath = $PWD
    $stack = Get-Location -StackName $StackName
    $stackArray = $stack.ToArray()
    $last = $stackArray[0]
    $beforeLast = $stackArray[1]
    $stackArray[0] = $beforeLast
    $stackArray[1] = $last
    $stackArray | \% {Pop-Location}
    Set-Location -Path $stackArray[-1].Path
    $stackArray[($stackArray.Count-2)..0] | \% {
        Push-Location $\_.Path
    }
    Push-Location -Path $origPath.Path
}

cd C:
Push-Location 'C:Users'
Push-Location 'C:Program Files'
Push-Location C:Windows
Get-Location -Stack


Produktion:


Path
----
C:Program Files
C:Users
C:


Byt nu de to øverste stier:


Swap-StackTop
Get-Location -Stack


Produktion:


Path
----
C:Users
C:Program Files
C:

Andre referencer 2


Tak, Keith Hill, til modulet CD.psm1!


Jeg tog den grundlæggende stakkode og implementerede den med en mere PowerShell-lignende syntaks. Jeg har også ændret det lidt for at holde fremad stakken poster, når du skifter steder, mens i midten af ​​stakken. For enhver, der er interesseret, er den tilgængelig i PowerShell galleriet:


https://www.powershellgallery.com/packages/LocationHistory/[34]