2014-11-04 195 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)

两者都可以工作,但第二个不必要地更复杂。