2017-01-04 2 views
0

Ich bereite ein Skript vor, das einige Bilder aus dem gleichen Ordner wie das Skript verwenden muss. Die Bilder werden auf der WinForms GUI angezeigt.Wie wird FromFile in Powershell festgelegt?

$imgred = [System.Drawing.Image]::FromFile("red.png") 

Wenn ich das ps1-Skript manuell aus dem Ordner nur durch Klicken ausführen, lädt es Bilder und zeigt sie an. Leider erinnere ich mich nicht genau, wie ich das eingerichtet habe, aber so weit ich kann, war es nur das Standardprogramm für ps1-Dateien. Wenn ich das Skript von einer cmd-Datei aus führe (um das cmd-Fenster auszublenden), werden auch diese geladen.

Aber wenn ich mit PowerShell IDE öffnen und es ausführen, erhalte ich Fehler und keine Symbole werden auf meiner GUI angezeigt. Wenn ich mit Powershell öffne, kann es auch nicht geladen werden.

Der einzige Unterschied zwischen diesen Modi laufen I ist mit finden:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition 
$scriptPath    #always same, the location of script 
(Get-Location).Path  #scriptlocation when icons loaded, system32 folder when unsuccessful load 

gleiche Verhalten, wenn cd $ scriptPath tun, so dass der aktuelle Ordner ist höchstwahrscheinlich nicht der Schuldige.

Ich weiß, ich kann $ scriptPath/red.png in jede Datei lesen Zeile (FromFile) schreiben, aber was ich will, ist es einmal zu definieren - der Standard-Speicherort für FromFile - und dann einfach Dateiname arbeiten unabhängig von der wie ich es betreibe.

Was ist zu ändern, so dass der Standardpfad zum Lesen von Dateien derselbe ist wie der Speicherort meines Skripts?

Antwort

2

Das Ändern des Standardpositionsstapels in PowerShell ($PWD) wirkt sich nicht auf das Arbeitsverzeichnis der Hostanwendung aus.

Um dies in Aktion zu sehen:

PS C:\Users\Mathias> $PWD.Path 
C:\Users\Mathias 
PS C:\Users\Mathias> [System.IO.Directory]::GetCurrentDirectory() 
C:\Users\Mathias 

jetzt Standort ändern:

PS C:\Users\Mathias> cd C:\ 
PS C:\> $PWD.Path 
C:\ 
PS C:\> [System.IO.Directory]::GetCurrentDirectory() 
C:\Users\Mathias 

Wenn Sie eine .NET-Methode aufrufen, die einen Dateipfad Argument, wie Image.FromFile(), wird der Pfad relativ aufgelöst zu letzterem, nicht $PWD.

Wenn Sie einen Dateipfad relativ zu $PWD übergeben wollen, tun:

$pngPath = Join-Path $PWD "red.png" 
[System.Drawing.Image]::FromFile($pngPath) 

oder

[System.Drawing.Image]::FromFile("$PWD\red.png") 

Wenn Sie einen Pfad relativ zum Ausführen von Skripts erfordern, in Powershell 3.0 und höher Sie kann die $PSScriptRoot automatische Variable verwenden:

$pngPath = Join-Path $PSScriptRoot "red.png"  

Wenn Sie v2 unterstützen müssen.0 als auch, Sie so etwas wie die folgenden an der Spitze des Skripts setzen könnte:

if(-not(Get-Variable -Name PSScriptRoot)){ 
    $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Definition -Parent 
} 

Bei der Verwendung von Powershell im interaktiven Modus, Sie könnte die prompt Funktion konfigurieren .NET haben „folgen Sie herum "wie folgt:

aber ich würde empfehlen, dagegen, nur die Angewohnheit der Bereitstellung voll qualifizierte Pfade statt.

+0

gute Erklärung! –

+0

Ausgezeichnet! Danke, diese Zeile hat es geschafft: [System.IO.Directory] :: SetCurrentDirectory ($ scriptPath) – uldics

Verwandte Themen