Advertisement
Guest User

Untitled

a guest
Jun 16th, 2016
1,925
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #******************************************************************************
  2. # File:     Add-Font.ps1
  3. # Date:     09/22/2010
  4. # Version:  1.0.0
  5. #
  6. # Purpose:  PowerShell script to install Windows fonts.
  7. #
  8. # Usage:    Add-Font -help | -path "<Font file or folder path>"
  9. #
  10. # Copyright (C) 2010 Microsoft Corporation
  11. #
  12. #
  13. # Revisions:
  14. # ----------
  15. # 1.0.0   09/22/2010   Created script.
  16. #
  17. #******************************************************************************
  18.  
  19. #requires -Version 2.0
  20.  
  21. #*******************************************************************
  22. # Declare Parameters
  23. #*******************************************************************
  24. param(
  25.         [string] $path = "",
  26.    [switch] $help = $false
  27. )
  28.  
  29.  
  30. #*******************************************************************
  31. # Declare Global Variables and Constants
  32. #*******************************************************************
  33.  
  34. # Define constants
  35. set-variable CSIDL_FONTS 0x14 -option constant
  36.  
  37. # Create hashtable containing valid font file extensions and text to append to Registry entry name.
  38. $hashFontFileTypes = @{}
  39. $hashFontFileTypes.Add(".fon", "")
  40. $hashFontFileTypes.Add(".fnt", "")
  41. $hashFontFileTypes.Add(".ttf", " (TrueType)")
  42. $hashFontFileTypes.Add(".ttc", " (TrueType)")
  43. $hashFontFileTypes.Add(".otf", " (OpenType)")
  44. # Type 1 fonts require handling multiple resource files.
  45. # Not supported in this script
  46. #$hashFontFileTypes.Add(".mmm", "")
  47. #$hashFontFileTypes.Add(".pbf", "")
  48. #$hashFontFileTypes.Add(".pfm", "")
  49.  
  50. # Initialize variables
  51. $invocation = (Get-Variable MyInvocation -Scope 0).Value
  52. $scriptPath = Split-Path $Invocation.MyCommand.Path
  53. $fontRegistryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
  54.  
  55.  
  56. #*******************************************************************
  57. #  Load C# code
  58. #*******************************************************************
  59. $fontCSharpCode = @'
  60. using System;
  61. using System.Collections.Generic;
  62. using System.Text;
  63. using System.IO;
  64. using System.Runtime.InteropServices;
  65.  
  66. namespace FontResource
  67. {
  68.    public class AddRemoveFonts
  69.    {
  70.        private static IntPtr HWND_BROADCAST = new IntPtr(0xffff);
  71.        private static IntPtr HWND_TOP = new IntPtr(0);
  72.        private static IntPtr HWND_BOTTOM = new IntPtr(1);
  73.        private static IntPtr HWND_TOPMOST = new IntPtr(-1);
  74.        private static IntPtr HWND_NOTOPMOST = new IntPtr(-2);
  75.        private static IntPtr HWND_MESSAGE = new IntPtr(-3);
  76.  
  77.        [DllImport("gdi32.dll")]
  78.        static extern int AddFontResource(string lpFilename);
  79.  
  80.        [DllImport("gdi32.dll")]
  81.        static extern int RemoveFontResource(string lpFileName);
  82.  
  83.        [DllImport("user32.dll",CharSet=CharSet.Auto)]
  84.        private static extern int SendMessage(IntPtr hWnd, WM wMsg, IntPtr wParam, IntPtr lParam);
  85.  
  86.        [return: MarshalAs(UnmanagedType.Bool)]
  87.        [DllImport("user32.dll", SetLastError = true)]
  88.        private static extern bool PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam);
  89.  
  90.        public static int AddFont(string fontFilePath) {
  91.            FileInfo fontFile = new FileInfo(fontFilePath);
  92.            if (!fontFile.Exists)
  93.            {
  94.                return 0;
  95.            }
  96.            try
  97.            {
  98.                int retVal = AddFontResource(fontFilePath);
  99.  
  100.                //This version of SendMessage is a blocking call until all windows respond.
  101.                //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
  102.  
  103.                //Alternatively PostMessage instead of SendMessage to prevent application hang
  104.                bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
  105.  
  106.                return retVal;
  107.            }
  108.            catch
  109.            {
  110.                return 0;
  111.            }
  112.        }
  113.  
  114.        public static int RemoveFont(string fontFileName) {
  115.            //FileInfo fontFile = new FileInfo(fontFileName);
  116.            //if (!fontFile.Exists)
  117.            //{
  118.            //    return false;
  119.            //}
  120.            try
  121.            {
  122.                int retVal = RemoveFontResource(fontFileName);
  123.  
  124.                //This version of SendMessage is a blocking call until all windows respond.
  125.                //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
  126.  
  127.                //Alternatively PostMessage instead of SendMessage to prevent application hang
  128.                bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
  129.  
  130.                return retVal;
  131.            }
  132.            catch
  133.            {
  134.                return 0;
  135.            }
  136.        }
  137.  
  138.        public enum WM : uint
  139.        {
  140.            NULL = 0x0000,
  141.            CREATE = 0x0001,
  142.            DESTROY = 0x0002,
  143.            MOVE = 0x0003,
  144.            SIZE = 0x0005,
  145.            ACTIVATE = 0x0006,
  146.            SETFOCUS = 0x0007,
  147.            KILLFOCUS = 0x0008,
  148.            ENABLE = 0x000A,
  149.            SETREDRAW = 0x000B,
  150.            SETTEXT = 0x000C,
  151.            GETTEXT = 0x000D,
  152.            GETTEXTLENGTH = 0x000E,
  153.            PAINT = 0x000F,
  154.            CLOSE = 0x0010,
  155.            QUERYENDSESSION = 0x0011,
  156.            QUERYOPEN = 0x0013,
  157.            ENDSESSION = 0x0016,
  158.            QUIT = 0x0012,
  159.            ERASEBKGND = 0x0014,
  160.            SYSCOLORCHANGE = 0x0015,
  161.            SHOWWINDOW = 0x0018,
  162.            WININICHANGE = 0x001A,
  163.            SETTINGCHANGE = WM.WININICHANGE,
  164.            DEVMODECHANGE = 0x001B,
  165.            ACTIVATEAPP = 0x001C,
  166.            FONTCHANGE = 0x001D,
  167.            TIMECHANGE = 0x001E,
  168.            CANCELMODE = 0x001F,
  169.            SETCURSOR = 0x0020,
  170.            MOUSEACTIVATE = 0x0021,
  171.            CHILDACTIVATE = 0x0022,
  172.            QUEUESYNC = 0x0023,
  173.            GETMINMAXINFO = 0x0024,
  174.            PAINTICON = 0x0026,
  175.            ICONERASEBKGND = 0x0027,
  176.            NEXTDLGCTL = 0x0028,
  177.            SPOOLERSTATUS = 0x002A,
  178.            DRAWITEM = 0x002B,
  179.            MEASUREITEM = 0x002C,
  180.            DELETEITEM = 0x002D,
  181.            VKEYTOITEM = 0x002E,
  182.            CHARTOITEM = 0x002F,
  183.            SETFONT = 0x0030,
  184.            GETFONT = 0x0031,
  185.            SETHOTKEY = 0x0032,
  186.            GETHOTKEY = 0x0033,
  187.            QUERYDRAGICON = 0x0037,
  188.            COMPAREITEM = 0x0039,
  189.            GETOBJECT = 0x003D,
  190.            COMPACTING = 0x0041,
  191.            COMMNOTIFY = 0x0044,
  192.            WINDOWPOSCHANGING = 0x0046,
  193.            WINDOWPOSCHANGED = 0x0047,
  194.            POWER = 0x0048,
  195.            COPYDATA = 0x004A,
  196.            CANCELJOURNAL = 0x004B,
  197.            NOTIFY = 0x004E,
  198.            INPUTLANGCHANGEREQUEST = 0x0050,
  199.            INPUTLANGCHANGE = 0x0051,
  200.            TCARD = 0x0052,
  201.            HELP = 0x0053,
  202.            USERCHANGED = 0x0054,
  203.            NOTIFYFORMAT = 0x0055,
  204.            CONTEXTMENU = 0x007B,
  205.            STYLECHANGING = 0x007C,
  206.            STYLECHANGED = 0x007D,
  207.            DISPLAYCHANGE = 0x007E,
  208.            GETICON = 0x007F,
  209.            SETICON = 0x0080,
  210.            NCCREATE = 0x0081,
  211.            NCDESTROY = 0x0082,
  212.            NCCALCSIZE = 0x0083,
  213.            NCHITTEST = 0x0084,
  214.            NCPAINT = 0x0085,
  215.            NCACTIVATE = 0x0086,
  216.            GETDLGCODE = 0x0087,
  217.            SYNCPAINT = 0x0088,
  218.            NCMOUSEMOVE = 0x00A0,
  219.            NCLBUTTONDOWN = 0x00A1,
  220.            NCLBUTTONUP = 0x00A2,
  221.            NCLBUTTONDBLCLK = 0x00A3,
  222.            NCRBUTTONDOWN = 0x00A4,
  223.            NCRBUTTONUP = 0x00A5,
  224.            NCRBUTTONDBLCLK = 0x00A6,
  225.            NCMBUTTONDOWN = 0x00A7,
  226.            NCMBUTTONUP = 0x00A8,
  227.            NCMBUTTONDBLCLK = 0x00A9,
  228.            NCXBUTTONDOWN = 0x00AB,
  229.            NCXBUTTONUP = 0x00AC,
  230.            NCXBUTTONDBLCLK = 0x00AD,
  231.            INPUT_DEVICE_CHANGE = 0x00FE,
  232.            INPUT = 0x00FF,
  233.            KEYFIRST = 0x0100,
  234.            KEYDOWN = 0x0100,
  235.            KEYUP = 0x0101,
  236.            CHAR = 0x0102,
  237.            DEADCHAR = 0x0103,
  238.            SYSKEYDOWN = 0x0104,
  239.            SYSKEYUP = 0x0105,
  240.            SYSCHAR = 0x0106,
  241.            SYSDEADCHAR = 0x0107,
  242.            UNICHAR = 0x0109,
  243.            KEYLAST = 0x0109,
  244.            IME_STARTCOMPOSITION = 0x010D,
  245.            IME_ENDCOMPOSITION = 0x010E,
  246.            IME_COMPOSITION = 0x010F,
  247.            IME_KEYLAST = 0x010F,
  248.            INITDIALOG = 0x0110,
  249.            COMMAND = 0x0111,
  250.            SYSCOMMAND = 0x0112,
  251.            TIMER = 0x0113,
  252.            HSCROLL = 0x0114,
  253.            VSCROLL = 0x0115,
  254.            INITMENU = 0x0116,
  255.            INITMENUPOPUP = 0x0117,
  256.            MENUSELECT = 0x011F,
  257.            MENUCHAR = 0x0120,
  258.            ENTERIDLE = 0x0121,
  259.            MENURBUTTONUP = 0x0122,
  260.            MENUDRAG = 0x0123,
  261.            MENUGETOBJECT = 0x0124,
  262.            UNINITMENUPOPUP = 0x0125,
  263.            MENUCOMMAND = 0x0126,
  264.            CHANGEUISTATE = 0x0127,
  265.            UPDATEUISTATE = 0x0128,
  266.            QUERYUISTATE = 0x0129,
  267.            CTLCOLORMSGBOX = 0x0132,
  268.            CTLCOLOREDIT = 0x0133,
  269.            CTLCOLORLISTBOX = 0x0134,
  270.            CTLCOLORBTN = 0x0135,
  271.            CTLCOLORDLG = 0x0136,
  272.            CTLCOLORSCROLLBAR = 0x0137,
  273.            CTLCOLORSTATIC = 0x0138,
  274.            MOUSEFIRST = 0x0200,
  275.            MOUSEMOVE = 0x0200,
  276.            LBUTTONDOWN = 0x0201,
  277.            LBUTTONUP = 0x0202,
  278.            LBUTTONDBLCLK = 0x0203,
  279.            RBUTTONDOWN = 0x0204,
  280.            RBUTTONUP = 0x0205,
  281.            RBUTTONDBLCLK = 0x0206,
  282.            MBUTTONDOWN = 0x0207,
  283.            MBUTTONUP = 0x0208,
  284.            MBUTTONDBLCLK = 0x0209,
  285.            MOUSEWHEEL = 0x020A,
  286.            XBUTTONDOWN = 0x020B,
  287.            XBUTTONUP = 0x020C,
  288.            XBUTTONDBLCLK = 0x020D,
  289.            MOUSEHWHEEL = 0x020E,
  290.            MOUSELAST = 0x020E,
  291.            PARENTNOTIFY = 0x0210,
  292.            ENTERMENULOOP = 0x0211,
  293.            EXITMENULOOP = 0x0212,
  294.            NEXTMENU = 0x0213,
  295.            SIZING = 0x0214,
  296.            CAPTURECHANGED = 0x0215,
  297.            MOVING = 0x0216,
  298.            POWERBROADCAST = 0x0218,
  299.            DEVICECHANGE = 0x0219,
  300.            MDICREATE = 0x0220,
  301.            MDIDESTROY = 0x0221,
  302.            MDIACTIVATE = 0x0222,
  303.            MDIRESTORE = 0x0223,
  304.            MDINEXT = 0x0224,
  305.            MDIMAXIMIZE = 0x0225,
  306.            MDITILE = 0x0226,
  307.            MDICASCADE = 0x0227,
  308.            MDIICONARRANGE = 0x0228,
  309.            MDIGETACTIVE = 0x0229,
  310.            MDISETMENU = 0x0230,
  311.            ENTERSIZEMOVE = 0x0231,
  312.            EXITSIZEMOVE = 0x0232,
  313.            DROPFILES = 0x0233,
  314.            MDIREFRESHMENU = 0x0234,
  315.            IME_SETCONTEXT = 0x0281,
  316.            IME_NOTIFY = 0x0282,
  317.            IME_CONTROL = 0x0283,
  318.            IME_COMPOSITIONFULL = 0x0284,
  319.            IME_SELECT = 0x0285,
  320.            IME_CHAR = 0x0286,
  321.            IME_REQUEST = 0x0288,
  322.            IME_KEYDOWN = 0x0290,
  323.            IME_KEYUP = 0x0291,
  324.            MOUSEHOVER = 0x02A1,
  325.            MOUSELEAVE = 0x02A3,
  326.            NCMOUSEHOVER = 0x02A0,
  327.            NCMOUSELEAVE = 0x02A2,
  328.            WTSSESSION_CHANGE = 0x02B1,
  329.            TABLET_FIRST = 0x02c0,
  330.            TABLET_LAST = 0x02df,
  331.            CUT = 0x0300,
  332.            COPY = 0x0301,
  333.            PASTE = 0x0302,
  334.            CLEAR = 0x0303,
  335.            UNDO = 0x0304,
  336.            RENDERFORMAT = 0x0305,
  337.            RENDERALLFORMATS = 0x0306,
  338.            DESTROYCLIPBOARD = 0x0307,
  339.            DRAWCLIPBOARD = 0x0308,
  340.            PAINTCLIPBOARD = 0x0309,
  341.            VSCROLLCLIPBOARD = 0x030A,
  342.            SIZECLIPBOARD = 0x030B,
  343.            ASKCBFORMATNAME = 0x030C,
  344.            CHANGECBCHAIN = 0x030D,
  345.            HSCROLLCLIPBOARD = 0x030E,
  346.            QUERYNEWPALETTE = 0x030F,
  347.            PALETTEISCHANGING = 0x0310,
  348.            PALETTECHANGED = 0x0311,
  349.            HOTKEY = 0x0312,
  350.            PRINT = 0x0317,
  351.            PRINTCLIENT = 0x0318,
  352.            APPCOMMAND = 0x0319,
  353.            THEMECHANGED = 0x031A,
  354.            CLIPBOARDUPDATE = 0x031D,
  355.            DWMCOMPOSITIONCHANGED = 0x031E,
  356.            DWMNCRENDERINGCHANGED = 0x031F,
  357.            DWMCOLORIZATIONCOLORCHANGED = 0x0320,
  358.            DWMWINDOWMAXIMIZEDCHANGE = 0x0321,
  359.            GETTITLEBARINFOEX = 0x033F,
  360.            HANDHELDFIRST = 0x0358,
  361.            HANDHELDLAST = 0x035F,
  362.            AFXFIRST = 0x0360,
  363.            AFXLAST = 0x037F,
  364.            PENWINFIRST = 0x0380,
  365.            PENWINLAST = 0x038F,
  366.            APP = 0x8000,
  367.            USER = 0x0400,
  368.            CPL_LAUNCH = USER+0x1000,
  369.            CPL_LAUNCHED = USER+0x1001,
  370.            SYSTIMER = 0x118
  371.        }
  372.  
  373.    }
  374. }
  375. '@
  376. Add-Type $fontCSharpCode
  377.  
  378.  
  379. #*******************************************************************
  380. # Declare Functions
  381. #*******************************************************************
  382.  
  383. #*******************************************************************
  384. # Function Get-SpecialFolder()
  385. #
  386. # Purpose:  Convert a CSIDL string to a folder parh string
  387. #
  388. # Input:    $id    CSIDL folder identifier string
  389. #
  390. # Returns:  Folder path
  391. #
  392. #*******************************************************************
  393. function Get-SpecialFolder($id)
  394. {
  395.     $shell = New-Object –COM "Shell.Application"
  396.     $folder = $shell.NameSpace($id)
  397.     $specialFolder = $folder.Self.Path
  398.     $specialFolder
  399. }
  400.  
  401.  
  402. #*******************************************************************
  403. # Function Add-SingleFont()
  404. #
  405. # Purpose:  Install a font file
  406. #
  407. # Input:    $file    Font file path
  408. #
  409. # Returns:  0 - success, 1 - failure
  410. #
  411. #*******************************************************************
  412. function Add-SingleFont($filePath)
  413. {
  414.     try
  415.     {
  416.         [string]$filePath = (resolve-path $filePath).path
  417.         [string]$fileDir  = split-path $filePath
  418.         [string]$fileName = split-path $filePath -leaf
  419.         [string]$fileExt = (Get-Item $filePath).extension
  420.         [string]$fileBaseName = $fileName -replace($fileExt ,"")
  421.  
  422.         $shell = new-object -com shell.application
  423.         $myFolder = $shell.Namespace($fileDir)
  424.         $fileobj = $myFolder.Items().Item($fileName)
  425.         $fontName = $myFolder.GetDetailsOf($fileobj,21)
  426.  
  427.         if ($fontName -eq "") { $fontName = $fileBaseName }
  428.  
  429.         copy-item $filePath -destination $fontsFolderPath
  430.  
  431.         $fontFinalPath = Join-Path $fontsFolderPath $fileName
  432.         $retVal = [FontResource.AddRemoveFonts]::AddFont($fontFinalPath)
  433.  
  434.         if ($retVal -eq 0) {
  435.             Write-Host "Font $($filePath) installation failed"
  436.             Write-Host ""
  437.             1
  438.         }
  439.         else
  440.         {
  441.             Write-Host "Font $($filePath) installed successfully"
  442.             Write-Host ""
  443.             Set-ItemProperty -path "$($fontRegistryPath)" -name "$($fontName)$($hashFontFileTypes.item($fileExt))" -value "$($fileName)" -type STRING
  444.             0
  445.         }
  446.         ""
  447.     }
  448.     catch
  449.     {
  450.         Write-Host "An error occured installing $($filePath)"
  451.         Write-Host ""
  452.         Write-Host "$($error[0].ToString())"
  453.         Write-Host ""
  454.         1
  455.     }
  456. }
  457.  
  458.  
  459. #*******************************************************************
  460. # Function Show-Usage()
  461. #
  462. # Purpose:   Shows the correct usage to the user.
  463. #
  464. # Input:     None
  465. #
  466. # Output:    Help messages are displayed on screen.
  467. #
  468. #*******************************************************************
  469. function Show-Usage()
  470. {
  471. $usage = @'
  472. Add-Font.ps1
  473. This script is used to install Windows fonts.
  474.  
  475. Usage:
  476. Add-Font.ps1 -help | -path "<Font file or folder path>"
  477.  
  478. Parameters:
  479.  
  480.    -help
  481.     Displays usage information.
  482.  
  483.    -path
  484.     May be either the path to a font file to install or the path to a folder
  485.     containing font files to install.  Valid file types are .fon, .fnt,
  486.     .ttf,.ttc, .otf, .mmm, .pbf, and .pfm
  487.  
  488.    -folder
  489.     Path to a folder containing font files to install.
  490.  
  491. Examples:
  492.    Add-Font.ps1
  493.    Add-Font.ps1 -file "C:\Custom Fonts\MyFont.ttf"
  494.    Add-Font.ps1 -folder "C:\Custom Fonts"
  495. '@
  496.  
  497. $usage
  498. }
  499.  
  500.  
  501. #*******************************************************************
  502. # Function Process-Arguments()
  503. #
  504. # Purpose: To validate parameters and their values
  505. #
  506. # Input:   All parameters
  507. #
  508. # Output:  Exit script if parameters are invalid
  509. #
  510. #*******************************************************************
  511. function Process-Arguments()
  512. {
  513.     ## Write-host 'Processing Arguments'
  514.  
  515.     if ($unnamedArgs.Length -gt 0)
  516.     {
  517.         write-host "The following arguments are not defined:"
  518.         $unnamedArgs
  519.     }
  520.  
  521.     if ($help -eq $true)
  522.     {
  523.         Show-Usage
  524.         break
  525.     }
  526.  
  527.     if ((Test-Path $path -PathType Leaf) -eq $true)
  528.     {
  529.         If ($hashFontFileTypes.ContainsKey((Get-Item $path).Extension))
  530.         {
  531.             $retVal = Add-SingleFont $path
  532.             if ($retVal -ne 0)
  533.             {
  534.                 exit 1
  535.             }
  536.             else
  537.             {
  538.                 exit 0
  539.             }
  540.         }
  541.         else
  542.         {
  543.             "$($path) not a valid font file type"
  544.             ""
  545.             exit 1
  546.         }
  547.     }
  548.     elseif ((Test-Path $path -PathType Container) -eq $true)
  549.     {
  550.         $bErrorOccured = $false
  551.         foreach($file in (Get-Childitem $path))
  552.         {
  553.  
  554.             if ($hashFontFileTypes.ContainsKey($file.Extension))
  555.             {
  556.                 $retVal = Add-SingleFont (Join-Path $path $file.Name)
  557.                 if ($retVal -ne 0)
  558.                 {
  559.                     $bErrorOccured = $true
  560.                 }
  561.             }
  562.             else
  563.             {
  564.                 "$(Join-Path $path $file.Name) not a valid font file type"
  565.                 ""
  566.             }
  567.         }
  568.  
  569.         If ($bErrorOccured -eq $true)
  570.         {
  571.             exit 1
  572.         }
  573.         else
  574.         {
  575.             exit 0
  576.         }
  577.     }
  578.     else
  579.     {
  580.         "$($path) not found"
  581.         ""
  582.         exit 1
  583.     }
  584. }
  585.  
  586.  
  587. #*******************************************************************
  588. # Main Script
  589. #*******************************************************************
  590.  
  591. $fontsFolderPath = Get-SpecialFolder($CSIDL_FONTS)
  592. Process-Arguments
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement