Hat Powershell ein Analogon von Zsh's Vared?


1

Angenommen, Sie sind zu PowerShell gegangen und haben einen Pfad hinzugefügt:

$env:path += 'C:\banal\cranial\inversion'

Ups, du hast a vergessen; Darin sollte es gewesen sein

$env:path += ';C:\banal\cranial\inversion'

- aber dein Weg ist schon verkorkst. In zsh können wir gerade vared PATH; Was ist mit PowerShell? Gibt es eine Möglichkeit, die Variable zu bearbeiten, anstatt sie erneut zurückzusetzen? Und wie können Sie beim Zurücksetzen nur einen Teil davon kopieren und einfügen, wenn er sich umgibt?


Das zsh builtin heißt varedeher als varedit.
Dennis Williamson

Na sicher; Kontextwechsel ... behoben
Alexy Khrabrov

Antworten:


1

Das ist nicht der Fall, aber Sie könnten Folgendes tun:

    function Edit-Variable {
#.Parameter name
#    The name (or path) to the variable to edit.
#.Parameter Environment
#    Optional switch to force evaluating the name as an environment variable. You don't need this if you specify the path as env:Path instead of just "Path"
#.Example
#     Edit-Variable -env path
#.Example
#     Edit-Variable profile
#.Example
#     Edit-Variable env:\path
#.Example
#     Edit-Variable variable:profile

param(
    [Parameter(Position=0,ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true)]
    [string]$name
,
    [switch]$Environment
)
process {
    $path = Resolve-Path $name -ErrorAction SilentlyContinue
    if($Environment) {
        ## Force Env: if they said -Env
        if(!$path -or $Path.Provider.Name -ne "Environment") {
            $path = Resolve-Path "Env:$name"
        }
    } else {
        if($Path -and $Path.Provider.Name -eq "Environment") {
            $Environment = $true
        } elseif(!$path -or $Path.Provider.Name -ne "Variable") {
            $path = Resolve-Path "Variable:$name" -ErrorAction SilentlyContinue
        }
    }

    $temp = [IO.Path]::GetTempFileName()
    if($path) {
        if(!$Environment) {
            $value = (Get-Variable $path.ProviderPath).Value
            $string = $value -is [String]
            if(!$string) {
                Write-Warning "Variable $name is not a string variable, editing as CliXml"
                Export-Clixml $temp -InputObject $Value 
            } else {
                Set-Content $temp $Value
            }
        } else {
            Get-Content $path | Set-Content $temp
        }
    } else {
        $Environment = $false
        New-Variable $Name
        $path = Resolve-Path Variable:$name -ErrorAction SilentlyContinue
    }
    if(!$path) {
        Write-Error "Cannot find variable '$name' because it does not exist."
    } else {
        # Let the user edit it in notepad, and see if they save it
        $pre = Get-ChildItem $temp
        (Start-Process notepad $temp -passthru).WaitForExit()
        $post = Get-ChildItem $temp
        if($post.LastWriteTime -gt $pre.LastWriteTime) {
            if(!$Environment) {
                if(!$string) {
                    Import-CliXml $temp | Set-Variable $path.ProviderPath
                } else {
                    Get-Content $temp | Set-Variable $path.ProviderPath
                }
            } else {
                Get-Content $temp | Set-Content $path
            }
        }
    }
    Remove-Item $temp -ErrorAction SilentlyContinue
}
}

Set-Alias vared Edit-Variable

Ich weiß, dass zsh nicht so funktioniert, aber der Notizblock war praktisch ...


Sehr interessant! Wenn Sie dies in PS 2.0 einfügen und dann vared env: path sagen, wird eine Warnung ausgegeben, dass es sich nicht um eine Zeichenfolgenvariable handelt, die als CliXml bearbeitet wird. Im Editor wird dann ein <Nil /> in <Objs ...> eingeschlossen.
Alexy Khrabrov

try vared -env pathor vared path -env... Ich habe den enva-Schalter gedrückt: Es funktioniert mit Umgebungsvariablen und regulären Variablen (und alles andere mit Inhalt, wirklich). Ich überlegte, ob ich das Laufwerk benötigen vared profileund vared env:pathnur erkennen sollte, um zu sehen, ob es in Ordnung ist, aber am Ende entschied ich mich für den Schalter. Ich hätte ein Beispiel einfügen sollen, das werde ich beheben.
Jaykul

OK, ich habe die Fehlerbehandlung komplett überarbeitet, also kannst du jetzt entweder eine machen, die du Edit-Variable env:pathEdit-Variable -env path
magst

0

Sie können die String-Methoden verwenden, um die Korrektur durchzuführen

$indexError = $env:Path.LastIndexOf("C:")
$env:Path = $env:Path.remove($indexError, 1)
$env:Path = $env.Insert($indexError, ";C")

Vergessen Sie nicht, dass in Powershell alles ein Objekt ist und Sie alle Programmierstrategien verwenden können, um das zu erreichen, was Sie benötigen.


das ist auch sehr nützlich! sobald es mir möglich ist, mache ich es auf
Alexy Khrabrov

Ja, es ist völlig richtig, dass Sie dies mit einem einfachen Skript erledigen können. Persönlich würde ich$Env:Path = $Env:Path -replace '(?<!;)C:',';C:' # replace C: that doesn't follow a ; with ';C:'
Jaykul

@ Jaykul sehr schön, was du getan hast, ich will nicht mehr erfahren, was ist der Name des Themas, um weiter zu suchen?
mjsr

Es ist ein regulärer Ausdruck: Insbesondere ist dies eine negative Behauptung hinter der Breite Null. regular-expressions.info/lookaround.html
Jaykul
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.