2014-06-22 4 views
13

Ich mag so einen Alias ​​entfernen:Entfernen alias in Skript

Remove-Item Alias:wget 

dann den Alias ​​versucht gibt das erwartete Ergebnis:

PS > wget 
wget : The term 'wget' is not recognized as the name of a cmdlet, function, 
script file, or operable program. 

Allerdings, wenn ich das gleiche in ein Skript setzen,

PS > cat wget.ps1 
Remove-Item Alias:wget 
wget 

es gibt unerwartetes Ergebnis

cmdlet Invoke-WebRequest at command pipeline position 1 
Supply values for the following parameters: 
Uri: 
+0

Dieses Verhalten scheint für alle Standardaliase konsistent zu sein. Benutzerdefinierte Aliase (zumindest für mich) können innerhalb eines Skripts entfernt werden. – Kohlbrr

+0

Das ist wirklich komisch, es muss ein Problem sein. Ich werde nach einigen weiteren Tests zurückschreiben. –

Antwort

11

Die folgenden

If (Test-Path Alias:wget) {Remove-Item Alias:wget} 
If (Test-Path Alias:wget) {Remove-Item Alias:wget} 
wget 

Die erste Zeile entfernt die Script Ebene alias scheint zu funktionieren, und der zweite entfernt die Global Level-Alias. Beachten Sie, dass beide getestet werden müssen, denn wenn die Global nicht existiert, wird die Script nicht erstellt.

Auch dies funktioniert insofern, als es die Eltern ändert, ohne dot Sourcing.

Alternativ können Sie dot nur Ihre ursprüngliche Quelle und das würde

. .\wget.ps1 
+0

dot sourcing bewirkt, dass es in Ihrem aktuellen Umfang ausgeführt wird. Das macht Sinn. –

+3

Wie wäre es mit while (Test-Pfad Alias: wget) {Remove-Item Alias: wget} ' –

0

Es sieht so aus, als wenn Sie das Skript über die PowerShell-Konsole ausführen, erbt das Alias-Laufwerk von dieser Sitzung. Also, wenn wget da ist, funktioniert es, und wenn es nicht ist, scheitert es. Wenn Sie stattdessen das Skript in einem neuen Prozess ausführen, wird es normalerweise entfernt.

Hier ist der Code, den ich für meine Demo verwendet:

Remove-Item -Path Alias:\wget -Force 
wget 
Start-Sleep -Seconds 100 

Der Start-Schlaf Konsole aus dem Schließen sofort halten. Versuchen Sie, das Skript in einem neuen Prozess auszuführen. Ich benutzen den Lauf prompt und Powershell selbst durch Eingabe von `powershell.exe -datei pathtoscript '

6

Der Grund für diese Arbeit ist Umfang ...

Es gibt vier Bereiche: lokale, Skript, privat, und global

Die Regeln für Variablen, Funktionen und Aliase sagen, dass PowerShell die übergeordneten Bereiche durchsuchen wird, wenn sie nicht im aktuellen Bereich definiert sind.

Der Standardwert für einen Alias ​​ist allscope, wodurch er von allen untergeordneten Bereichen sichtbar gemacht wird und auch in jeden neuen untergeordneten Bereich übernommen wird (ich denke, das wäre eine faire Definition).

Get-Alias -Name wget | select Name,options 

Name Options 

wget AllScope 

Sobald Sie den Alias ​​entfernen, die der Skriptbereich (scope 0) ist, wird es dann den Alias ​​aus dem globalen/geordneten Bereich (Scope 1) finden.

Wenn Sie die Quelle dot angeben, sagen Sie nur, dass Sie das Skript zuerst im aufrufenden/globalen Bereich ausführen, sodass Sie den globalen Alias ​​standardmäßig entfernen.

Versuchen Sie diese ...

Beispiel # 1.


1,1) die Aliasnamen aus dem globalen Bereich entfernen.

Remove-Item -Path Alias:\wget 

1,2) Erstellen Sie einen neuen eine (global scope) und es privat machen.

New-Alias -Name wget -Value dir -Scope private 

1,3) Jetzt ist der Alias ​​nicht sichtbar aus dem verschachtelten Bereich. Also versuchen Sie das Skript auszuführen und es wird nicht gefunden.

Beispiel # 2.


2,1) die Aliasnamen aus dem globalen Bereich entfernen. Remove-Item -Path Alias: \ wget

2,2) einen neuen erstellen und macht es AllScope

New-Alias -Name wget -Value dir -Option AllScope 

2,3) nun Ihr Skript ausführen, und es wird gut funktionieren (mit dem neuen alias dir aus dem übergeordneten Bereich)

Sie könnten das gleiche auch mit Variablen versuchen. Sie sollten einfacher zu demontieren sein (und damit spielen), da Sie leichter mit dem Bereichsparameter spielen können, wenn Sie Neu/Abrufen/Festlegen/Entfernen-Scope 1 oder Bereich 0 verwenden oder die Bereichsmodifikatoren verwenden, z. B. $ global: ein.

0

Offensichtlich sind einige der anderen Antworten auf der Strecke und haben die Tatsache erkannt, dass der Alias ​​in mehreren Bereichen vorhanden ist.

Wenn Sie in einem Skript jedoch versuchen, wget.exe anstelle von Invoke-WebRequest (oder wget.ps1) aufzurufen, lautet die einfachste Antwort möglicherweise, beim Aufruf die Erweiterung ".exe" in den Befehlsnamen einzufügen es. Auf diese Weise müssen Sie nicht mit den Aliasnamen herumspielen.