2017-01-04 2 views
0

Я готовлю сценарий, который должен использовать некоторые изображения из той же папки, что и скрипт. Изображения должны отображаться в графическом интерфейсе WinForms.Как установить местоположение FromFile в Powershell?

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

Когда я запускаю сценарий ps1 вручную из папки, просто щелкнув, он загружает изображения и показывает их. К сожалению, я не помню точно, как я настроил это, но насколько я могу, это просто программа по умолчанию для файлов ps1. Когда я запускаю скрипт из cmd-файла (чтобы скрыть окно cmd), он также загружает их.

Но когда я открываю с помощью PowerShell IDE и запускаю его, я получаю ошибки, и никакие значки не отображаются в моем графическом интерфейсе. Когда я открываю с помощью Powershell, он также не может загрузить их.

Единственное различие между этими режимами работают я могу найти с:

$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 

такое же поведение при выполнении CD $ scriptPath, поэтому текущая папка, скорее всего, не виновный.

Я знаю, что могу писать $ scriptPath/red.png в каждой строке чтения файла (FromFile), но то, что я хочу, это определить его один раз - расположение по умолчанию для FromFile, а затем просто работать с простым файлом независимо от Я запускаю его.

Что нужно изменить, чтобы путь чтения файлов по умолчанию был таким же, как и в моем расположении сценариев?

ответ

2

Изменение установочного стека по умолчанию в PowerShell ($PWD) не влияет на рабочий каталог хост-приложения.

Чтобы увидеть это в действии:

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

Теперь изменить местоположение:

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

При вызове метода .NET, который принимает путь к файлу аргумент, как Image.FromFile(), путь разрешен относительный к последнему, а не $PWD.

Если вы хотите передать путь к файлу относительно $PWD, сделайте следующее:

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

или

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

Если требуется путь относительно исполняющего сценария, в PowerShell 3.0 и выше вас может использовать автоматическую переменную $PSScriptRoot:

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

Если вам нужно поддерживать v2.0, а также, вы могли бы поставить что-то вроде следующего в верхней части вашего скрипта:

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

При использовании PowerShell в интерактивном режиме, вы может настроить функцию prompt иметь .NET «следовать за вами «вот так:

$function:prompt = { 
    if($ExecutionContext.SessionState.Drive.Current.Provider.Name -eq "FileSystem"){ 
     [System.IO.Directory]::SetCurrentDirectory($PWD.Path) 
    } 
    "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "; 
} 

, но я бы рекомендовал против этого просто вступить в привычку предоставлять полностью квалифицированные пути.

+0

хорошее описание! –

+0

Отлично! Спасибо, эта строка сделала это: [System.IO.Directory] :: SetCurrentDirectory ($ scriptPath) – uldics

Смежные вопросы