如何在PowerShell中将选项标志传递给Folder.CopyHere?

Ant*_*ean 7 com powershell

我正在尝试编写一个脚本,自动并静默地将一堆字体移动到字体特殊文件夹中,以便它们可用,就像您从资源管理器中"安装"它们一样(通过拖放,复制或右键单击并选择安装).我把这Shell.Application部分一直放到副本上.

$FONTS = 0x14
$shell = New-Object -ComObject Shell.Application
$source = $shell.Namespace($downloaded_path)
$target = $shell.Namespace($FONTS)
$target.CopyHere($source.Items())
Run Code Online (Sandbox Code Playgroud)

但是,某些系统可能已经安装了字体,我希望隐藏进度对话框并静默接受任何提示.

安装字体 该字体已安装

所以,我正在研究Folder.CopyHere选项标志.

  • 4 不显示进度对话框
  • 16 对于显示的任何对话框,回答"是全部".

我希望它们在此文件夹中受支持(某些选项在设计中被忽略).我认为这些是十进制的,对吧?他们需要转换吗?但是我传递它们,我仍然看到两个对话框.我试过了

$options = 4           <-- don't expect int to work
$options = 0x4         <-- thought hexidecimal would be ok, the VB documentation shows &H4&
$options = "4"         <-- string's the thing?
$options = [byte]4     <-- no luck with bytes
$options = [variant]4  <-- this isn't even a type accelerator!
Run Code Online (Sandbox Code Playgroud)

而且,如果我可以选择一个选项,我如何让它们都工作?我bor在一起吗?格式化怎么样?

$options = 4 -bor 16
Run Code Online (Sandbox Code Playgroud)

或者我添加它们或将它们转换为十六进制?

$options = "{0:X}" -f (4 + 16)
Run Code Online (Sandbox Code Playgroud)

Ant*_*ean 2

选项Folder.CopyHere标志可能根本不起作用。这让我很难过。我将不得不研究其中一种其他方法,所有这些方法都让我陷入了困境。

\n\n

单独的进程

\n\n

在新进程中调用副本并使用ProcessStartInfo属性隐藏窗口。我还没有实现这个,但我想知道它是否会解决用户提示覆盖现有文件的问题?

\n\n
Dim iProcess As New System.Diagnostics.ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + \xe2\x80\x9cunzip.exe\xe2\x80\x9d)\n\niProcess.CreateNoWindow = True\nDim sArgs As String = ZippedFile\niProcess.Arguments = sArgs\niProcess.WindowStyle = ProcessWindowStyle.Hidden\nDim p As New System.Diagnostics.Process\niProcess.UseShellExecute = False\np = System.Diagnostics.Process.Start(iProcess)\np.WaitForExit(30000)\nDim s As Integer = p.ExitCode\niProcess.UseShellExecute = True\n\np.Dispose()\niProcess = Nothing\n
Run Code Online (Sandbox Code Playgroud)\n\n

For循环

\n\n

复制不存在的项目。当我实际上想用同名的新字体文件更新现有字体时,这似乎会失败。

\n\n
foreach($File in $Fontdir) {\n    $fontName = $File.Name.Replace(".ttf", " Regular")\n    $objFolderItem = $objFolder.ParseName($fontName);\n    if (!$objFolderItem) {\n      $objFolder.CopyHere($File.fullname,0x14)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

删除现有的

\n\n

我正在考虑删除与我正在复制的字体同名的所有字体,然后复制该集。虽然这有点残酷。而且我相信如果该字体因为正在使用而无法删除,还会有另一个提示。

\n