从powershell
中的网络共享驱动器访问时,我无法加载Icon$IconPath = $pwd.Path + "\Icons\InstallIcon-F.ico"
$HFForm.icon = [System.Drawing.Icon]::ExtractAssociatedIcon($IconPath)
我收到此错误:
Exception calling "ExtractAssociatedIcon" with "1" argument(s): "The given path's format is not supported."
$HFForm.icon = [System.Drawing.Icon]::ExtractAssociatedIcon <<<< ($IconPath)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
答案 0 :(得分:0)
我的测试显示与PeterK相同。如果我使用驱动器号很好,但未映射的网络共享不是。
我能够通过将网络共享映射到驱动器号来使其工作。所以:
$something = [system.drawing.icon]::extractassociatedicon("c:\windows\system32\notepad.exe")
没有造成任何错误。也没有:
$something = [system.drawing.icon]::extractassociatedicon(($test.fullname))
$ test.fullname只是一个映射的网络文件路径。
最好扩展您的变量,以便我们可以看到您实际传入的内容。因为如果我浏览网络文件共享并展开$ pwd.path:
Microsoft.PowerShell.Core\FileSystem::\\user-pc\users
你几乎可以肯定地传递它。所以看看。我对Powershell如何格式化其显示方式做了很多工作,所以我相信你可以找到这个显示器。等效设置,但在此期间执行此操作:
$IconPath = $pwd.Path.split('::')[2] + "\Icons\InstallIcon-F.ico"
答案 1 :(得分:0)
将您的图标转换为其二进制数据的base64表示形式,然后将其存储在脚本本身(作为文本)中。
一旦将其编码为base64,您就可以使用此命令将其转换回图标,从而绕过UNC路径问题。
$HFForm.icon = [System.Convert]::FromBase64String('
AAABAAkAAAAAAAEAIABbfQEAlgAAAICAAAABACAAKAgBAPF9AQBgYAAAAQAgAKiUAAAZhgIASEgA
#
# There will be hundreds rows depending on your icon's size.
#
AMADAADAAwAA4AcAAPAPAADwDwAA+A8AAPgPAAD4DwAA/B8AAPwfAAA=')
BASE64片段。
#Be sure to edit the path to icon.
#
#Hint the result is copied to your clipboard - clip = clip.exe == google it.
$path = "A:\R2-D2-32x32.ico"
[convert]::ToBase64String((get-content $path -encoding byte)) | Clip
#After running the clip command, right click paste between the quotes
$HFForm.icon = [System.Convert]::FromBase64String('')
答案 2 :(得分:0)
我有一个解决方案。
首先,您必须导入SHGetFileInfo Methode并创建SHFILEINFO结构。
$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace System
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
public class SHGETFILEINFO
{
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes,ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
}
}
"@
Add-Type -TypeDefinition $code
创建结构对象。
#Path to the exe.
$Path = \\test.de\tes
[System.SHFILEINFO]$FileinfoStruct = New-Object System.SHFILEINFO
获取结构的大小
$Size = [System.Runtime.InteropServices.Marshal]::SizeOf($FileinfoStruct)
使用文件信息填充结构变量。
[System.SHGETFILEINFO]::SHGetFileInfo($Path,0, [ref]$FileinfoStruct,$Size,0x000000100)
创建图标。
$ICON = [System.Drawing.Icon]::FromHandle($FileinfoStruct.hIcon)