2

我正在尝试开发自己的Boxstarter脚本来启动新机器。我刚刚意识到我真的很想添加一行来更改默认应用程序以打开某些文件类型。例如,我想用 Notepad++ 打开 .txt 文件。我知道如何通过右键单击文件并检查其属性来执行此操作,但是我可以在 Boxstarter 脚本中添加一行来执行此操作吗?或者,由于 Boxstarter 基本上是一组特殊的 PowerShell 命令,是否有可以直接调用来更改opens with属性的 PowerShell 命令?我做了一些搜索,大部分结果都是关于如何让 PowerShell 打开某些东西,而不是更改opens with属性。其余的都是关于如何打开 PowerShell。

4

2 回答 2

2

另一种类似但不完全相同的方法是更改​​要与特定应用程序关联的文件关联。Chocolatey 包含一些辅助命令来执行此操作,因此可用于您的 Boxstarter 包。这是我的 Boxstarter 软件包之一的摘录:

Install-ChocolateyFileAssociation ".txt" "$env:programfiles\Sublime Text 2\sublime_text.exe"
Install-ChocolateyFileAssociation ".dll" "$($Boxstarter.programFiles86)\jetbrains\dotpeek\v1.1\Bin\dotpeek32.exe"

所以现在双击任何文本文件打开 sublime 或任何 dll 打开 dotpeek。

但我同意。能够添加到“打开方式...”列表仍然很有帮助。

于 2014-03-15T12:30:58.473 回答
0

感谢@Raf 为我指明了正确的方向。这是更改 .txt 文件的 OpensWith 属性的代码:

$principal = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$key = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\UserChoice",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions)
$acl = $key.GetAccessControl()
$right = "SetValue"
$denyrule = New-Object System.Security.AccessControl.RegistryAccessRule($principal,$right,"DENY")
$ret = $acl.RemoveAccessRule($denyrule)
$ret = $key.SetAccessControl($acl)
Set-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\UserChoice -Name ProgId -Value Applications\notepad++.exe

根据 TechNet 论坛中的答案稍作修改。

我还没有弄清楚是否有一个 boxstarter 快捷方式,但更改 ACL 规则是关键。没有它,您将无权更改此特定注册表项。即使我尝试以管理员身份运行 Powershell 并确保我对 UserChoice 键拥有所有正确的权限(管理员帐户和我的用户帐户都具有完全控制权),我仍然收到一个错误,即Requested registry access is not allowed.

于 2014-03-11T01:53:49.037 回答