Winforms 如何在Powershell中设置FromFile位置?

Winforms 如何在Powershell中设置FromFile位置?,winforms,powershell,location,fromfile,Winforms,Powershell,Location,Fromfile,我正在准备一个脚本,它需要使用与脚本相同文件夹中的一些图像。这些图像将显示在WinForms GUI上 $imgred = [System.Drawing.Image]::FromFile("red.png") 当我通过单击从文件夹手动运行ps1脚本时,它会加载图像并显示它们。不幸的是,我不记得我是如何设置的,但据我所知,它只是用于ps1文件的默认程序。 当我从cmd文件运行脚本(隐藏cmd窗口)时,它也会加载它们 但当我使用Powershell IDE打开并运行它时,会出现错误,并且GUI上

我正在准备一个脚本,它需要使用与脚本相同文件夹中的一些图像。这些图像将显示在WinForms GUI上

$imgred = [System.Drawing.Image]::FromFile("red.png")
当我通过单击从文件夹手动运行ps1脚本时,它会加载图像并显示它们。不幸的是,我不记得我是如何设置的,但据我所知,它只是用于ps1文件的默认程序。 当我从cmd文件运行脚本(隐藏cmd窗口)时,它也会加载它们

但当我使用Powershell IDE打开并运行它时,会出现错误,并且GUI上不会显示任何图标。 当我使用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时的行为相同,因此当前文件夹很可能不是罪魁祸首

我知道我可以在每个文件读取行(FromFile)中写入$scriptPath/red.png,但我想要的是定义它一次(FromFile的默认位置),然后让简单的文件名工作,不管我如何运行它


要更改什么以使默认文件读取路径与我的脚本位置相同?

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

如果需要相对于执行脚本的路径,在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时,您可以将
提示符
功能配置为具有
.NET
“跟随您”,如下所示:


但我建议不要这样做,而是养成提供完全限定路径的习惯。

修改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)

如果需要相对于执行脚本的路径,在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时,您可以将
提示符
功能配置为具有
.NET
“跟随您”,如下所示:


但我不建议这样做,只要养成提供完全合格路径的习惯即可。

太好了!谢谢,这行代码做到了:[System.IO.Directory]::SetCurrentDirectory($scriptPath)太棒了!谢谢,这一行做到了:[System.IO.Directory]::SetCurrentDirectory($scriptPath)