ExtractAssociatedIcon使用powershell在网络共享中提供异常

时间:2014-07-18 09:28:21

标签: powershell

从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

3 个答案:

答案 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)