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?

Alexy Khrabrov
quelle
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 ...

Jaykul
quelle
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.

mjsr
quelle
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