2014-11-04 143 views
1

我有一個安裝字體的腳本,檢查字體是否存在。但是,我無法驗證字體的存在。腳本安裝字體powershell

$FONTS = 0x14; 

$FromPath = "c:\fonts"; 

$ObjShell = New-Object -ComObject Shell.Application; 
$ObjFolder = $ObjShell.Namespace($FONTS); 

$CopyOptions = 4 + 16; 
$CopyFlag = [String]::Format("{0:x}", $CopyOptions); 

foreach($File in $(Get-ChildItem -Path $FromPath)){ 
    If ((Test-Path "c:\windows\fonts\$($File.name)") -eq $False) 
    { } 
    Else 
    { 
     $CopyFlag = [String]::Format("{0:x}", $CopyOptions); 
     $ObjFolder.CopyHere($File.fullname, $CopyOptions); 

     New-ItemProperty -Name $File.fullname -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value $File 
    } 
} 
+0

究竟是什麼問題? – Paul 2014-11-04 14:38:48

+0

錯誤在(else)中,會出現一條消息,要求替換現有的字體。這不應該發生,因爲(其他)應該安裝不存在的字體! – MeuChapeu 2014-11-04 14:45:37

回答

2

你如果說法是錯誤的,如果該文件存在,並

If ((Test-Path "c:\windows\fonts\$($File.name)") -eq $False) 

Test-Path回報truefalse,如果它不。所以在這種情況下,文件不存在,你有false -eq false = true所以沒有執行。只有在複製該項目的代碼已經存在時纔會被調用。

解決方案:

If (Test-Path "c:\windows\fonts\$($File.name)") 
+0

我使用瞭解決方案,它工作,謝謝! – MeuChapeu 2014-11-04 15:44:02

2

保羅是正確的。基本上你的If條件是倒退的。如果(Test-Path「c:\ windows \ fonts \ $($ File.name)」) 等效於 如果((Test-Path「c:\ windows \ fonts \ $($ File。名稱)「)-eq $ True)

兩者都可以工作,但第二個不必要地更復雜。