2016-08-08 1 views
2

xamlファイルを読み込んで表示するpowershellスクリプトがあります。 のようにXAMLファイル内の画像を使用する場合:Powershellのxamlでの相対パスの使い方

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

私は絶対パスを提供する必要があります。相対パスを使用できる構文がありますか? ハックソリューション:XAMLを読むと置き換える

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() 

ご注意:XAMLではありません。質問を明確にする

追加の例PowerShellスクリプトで動的な方法で現在のモジュールのパスを「D \テスト」埋め込み。 Powershellは動的にそれを読み取ります。

答えて

1

絵、スクリプトが同じフォルダにある場合、私は、あなたがこのような何かをしたいと思う:

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

そうでなければ、あなたは次のように以前のフォルダに入るためのパスに2点を追加することができます。

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

これは正確に動作しません。私はそれがパワーシェルで実行されているからだと思います。 – Vik

+0

私はそれを編集しました、今それを試してください:) –

+0

アイデアありがとう。これは私が回避しようとする回避策のハックです。私は私の質問を明確にするための小さな例を追加 – Vik

1

スクリプトディレクトリは、1行で簡単に特定できます。また、あなたのパスを組み合わせることJoin-Pathコマンドレットを使用するように考慮してください。すべてのフィードバックのための

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

アイデアありがとう。これは私が回避しようとする回避策のハックです。私は私の質問を明確にするための小さな例を追加しました – Vik

+0

作業ディレクトリ(Set-Location)をスクリプトの場所に変更し、相対パスで作業することもできます。しかし、これはハックになります。私が提供したソリューションは、最もクリーンなIMHOです。 –

+0

NOP: を変更し、Add-Setで「D:\ Test」を追加した場合、画像が見つかりません。 – Vik

0

感謝。 私はこのような問題を回避するに固執:これは$ syncHash.Window.ShowDialog前に実装する必要があり

$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 

()