2016-08-08 36 views
2

zu verwenden Ich habe ein Powershell-Skript lesen eine XAML-Datei und diese anzeigen. Wenn ein Bild in der XAML-Datei wie:Wie relativer Pfad in Xaml einer Powershell

<Image Source="D:\Test\MyPic.png" /> 

Ich habe den absoluten Pfad zur Verfügung zu stellen. Gibt es eine Syntax, die den relativen Pfad erlaubt? Hack Lösung: Lesen Sie XAML und ersetzen Sie "D: \ Test" mit Pfad Strommodul in einer dynamischen Art und Weise in der Powershell-Skript

Added Beispiel Frage zu klären:

Add-Type -assemblyName PresentationFramework, PresentationCore, WindowsBase 

$syncHash = [hashtable]::Synchronized(@{}) 
$newRunspace =[runspacefactory]::CreateRunspace() 
$newRunspace.ApartmentState = "STA" 
$newRunspace.ThreadOptions = "ReuseThread"   
$newRunspace.Open() 
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)   
$psCmd = [PowerShell]::Create().AddScript({ 
    [xml]$xaml = @" 
    <Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen"> 
     <Image Source="D:\Test\MyPic.png" /> 
    </Window> 
"@ 
    $reader=(New-Object System.Xml.XmlNodeReader $xaml) 
    $syncHash.Window=[Windows.Markup.XamlReader]::Load($reader) 
    $syncHash.Window.ShowDialog() | Out-Null 
}) 
$psCmd.Runspace = $newRunspace 
$data = $psCmd.BeginInvoke() 

Bitte beachten Sie: Das XAML ist nicht eingebettet. Powershell liest es dynamisch.

Antwort

1

Ich glaube, Sie so etwas wie dies wollen, wenn das Bild und Schrift in demselben Ordner ist:

$invocation = (Get-Variable MyInvocation).Value 
$directorypath = Split-Path $invocation.MyCommand.Path 
$settingspath = $directorypath + '\MyPic.png' 
<Image Source=$settingspath /> 

Ansonsten können Sie fügen Sie 2 Punkte in den Pfad in vorherigen Ordner zu erhalten wie:

$settingspath = $directorypath + '\..\' + '\MyPic.png' 
+0

dies genau funktioniert nicht. Ich denke, weil es in einer Powershell ausgeführt wird. – Vik

+0

Ich habe das bearbeitet, versuche es jetzt :) –

+0

Danke für die Idee. Dies ist der Workaround-Hack, den ich zu vermeiden versuche. Ich habe ein kleines Beispiel hinzugefügt, um meine Frage zu klären – Vik

1

Sie können das Skriptverzeichnis einfach mit einem Einzeiler bestimmen. Beachten Sie auch die Join-Path Cmdlets zu verwenden, um Ihren Weg zu kombinieren:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition 
$myPicPath = Join-Path $scriptPath 'MyPic.png' 
+0

Danke für die Idee. Dies ist der Workaround-Hack, den ich zu vermeiden versuche. Ich habe ein kleines Beispiel hinzugefügt, um meine Frage zu klären – Vik

+0

Sie könnten auch das Arbeitsverzeichnis (Set-Location) an den Speicherort des Skripts ändern und dann mit einem relativen Pfad arbeiten. Dies wäre jedoch ein Hack. Die Lösung, die ich zur Verfügung gestellt habe, ist die sauberste IMHO. –

+0

NOP: Wenn ich ändere und in AddScript Set-Location 'D: \ Test \' hinzufüge, wird das Bild nicht gefunden – Vik

0

Vielen Dank für alle Rückmeldungen. ich mit dem Problem zu umgehen, wie dies Stick:

$imgSplash = $syncHash.Window.FindName('imgSplash') 
$splashUri = New-Object System.Uri $imgSplash.Source 
$absolutPath = ("{0}\{1}" -f "D:\WhatEverPathNecessary,($splashUri.Segments | Select-Object -Last 1)) 
$imgSplash.Source = $absolutPath 

Dies vor $ syncHash.Window.ShowDialog umgesetzt werden muss()