在Windows 7上仅使用注册表异步启动程序,仅一次

4
我正在启动的程序是Windows记事本(用于程序安装后需要重新启动的自述文件)。我正在使用Windows 7专业版,并具有管理员权限。
我希望能让以下解决方案正常工作:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
Name: myregentry
Type: REG_SZ
Data: notepad.exe C:\test2.txt

然而,RunOnce是同步的(http://msdn.microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx)。这会导致记事本在完全黑屏的情况下启动(在tinypic上查看截图),除了阅读文本之外没有任何其他操作可能性。启动等待,只有在记事本窗口关闭后才恢复。对于我的使用来说,这是不可接受的(会使用户感到困惑)。
我可以让以下解决方案起作用:
1)创建一个注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
Name: myregentry
Type: REG_SZ
Data: C:\launchreadme.bat

2)在C:\ launchreadme.bat中创建一个自删除的批处理文件:

@ECHO OFF
start notepad.exe C:\test2.txt

REM **** Delete this script ****
DEL "%~f0"

这做到了我想要的效果。但是我想知道:
有没有更简洁的方法来完成此操作,而不需要先生成此批处理文件,只使用注册表即可?
这可能对其他人有用,因为网络上充满了“如何从注册表启动记事本”的示例,但其中没有一个(我能找到的)提到了此问题。
附加信息:
1. 我无法在注册表条目中使“start”起作用(start notepad.exe C:\test1.txt在启动时什么都不做)。
2. RunServicesOnce(而不是RunOnce),曾经用于异步地一次性启动程序,但显然在Windows 7中已经不存在了。
3. Run(而不是RunOnce)也是异步的,并且运行良好。但是显然我不想在每次重新启动后都启动此自述文件。

1
写入到 HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce 怎么样?这样直到用户登录后才会执行。 - Ken White
@Ken White:公平地说,我没有测试过你的解决方案。但是,我正在使用需要管理员权限的(NSIS)安装程序从注册表中编写。由于用户没有管理员权限,因此HKCU可能无法正常工作。 - tom_q
1个回答

4
你可以使用批处理文件的方式,而不需要实际创建一个批处理文件:
cmd /c "start notepad"

1
为了以后的参考,注册表数据使用了“cmd /c“start notepad.exe ^”C:\path with spaces\readme.txt^””。 - tom_q

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接