Winforms 如何在Powershell中设置FromFile位置?
我正在准备一个脚本,它需要使用与脚本相同文件夹中的一些图像。这些图像将显示在WinForms GUI上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上
$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)