在Windows中,如何使用批处理文件显示启动项?
答案 0 :(得分:3)
您的初创项目是您自己的项目和“所有用户”项目的组合。你可以找到自己的:
dir "%homedrive%%homepath%\start menu\progams\startup"
和“所有用户”(通常)用:
dir "%homedrive%%homepath%\..\all users\start menu\progams\startup"
您所要做的就是操纵文件名以删除路径,并在末尾操作“.lnk”以获取快捷方式名称。
如果你cd
先到这些目录而只是做dir,你甚至不必删除路径。
<强>更新强>
如果您的评论似乎表明,您想要在系统启动时启动所有内容,那么就会发现它们遍布整个地方。您需要获取Autoruns(或其命令行兄弟Autorunsc,出于您的目的)的副本。
这是最好的方法,因为它被微软自己“祝福”。
答案 1 :(得分:2)
如果您可以使用PowerShell,这里有一些使用AUTORUNSC的代码。
$autoruns = [xml](AUTORUNSC -x 2>$null)
foreach ($item in $autoruns.autoruns.item)
{
If ($item.Description.Length -gt 0)
{ Write-Output $item.Description.Trim() }
Else
{ Write-Output "n/a"}
Write-Output $item.ItemName.Trim()
Write-Output $item.imagepath.Trim()
"---------------------------------------"
}
编辑:AUTORUNSC上的-x
参数使其输出XML。
答案 2 :(得分:0)
“所有用户”似乎没有在MSConfig中显示什么内容。 无论如何都要查询注册表以获取MSConfig StartUp条目?
答案 3 :(得分:0)
如前所述,启动项是“所有用户”和当前用户的启动项的组合。启动项可以作为链接放在“开始”菜单“启动”文件夹中,也可以作为注册表项放置。
对于启动文件夹,您已经获得了Pax'答案中的路径,但请注意,在非英语版本的Windows中路径会有所不同。
对于注册表,我认为您不能仅使用批处理脚本来查询它。它可以从PowerShell脚本完成,如果这是一个选项。否则,我认为完成任务的最简单方法是为该任务制作一个小型实用程序。 (使用其中一种.NET语言很容易,或者如果你不能依赖.NET Framework,你就可以用C语言完成。)
可在此处找到注册表项,适用于所有用户:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
对于当前用户:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
最后,请注意注册表还包含RunOnce密钥;其中包含的条目只应在启动时运行一次,然后才能删除。
答案 4 :(得分:0)
您可以使用reg命令查询相应的注册表项:
reg QUERY HKCU\Software\Microsoft\Windows\CurrentVersion\Run > out
这将为您提供文件“out”中的键列表,如下所示:
UIWatcher REG_SZ D:\Utils\Ashampoo UnInstaller\UIWatcher.exe
SpybotSD TeaTimer REG_SZ C:\Program Files\Spybot - Search & Destroy\TeaTimer.exe
SandboxieControl REG_SZ "C:\Program Files\Sandboxie\SbieCtrl.exe"
WMPNSCFG REG_SZ C:\Program Files\Windows Media Player\WMPNSCFG.exe
您需要解析此列表以获取REG_SZ为分隔符的第一个和第二个标记。如果你想坚持使用普通的批处理语言(meh ...),除了麻烦之外别无其他,你必须使用FOR / F命令来获取令牌:
FOR /F "tokens=1,2 delims=$" %i in (out) do @echo %i %j
在此之前,你需要用一些char替换REG_SZ,比方说$,因为FOR不接受字符串分隔符。整个过程可以放在一个批处理文件中:
SETLOCAL EnableDelayedExpansion
@echo off > StartUp.txt
FOR /F "skip=2 usebackq tokens=* delims= " %%i in (`reg QUERY HKCU\Software\Microsoft\Windows\CurrentVersion\Run`) do (
set LINE=%%i
set LINE=!LINE:REG_SZ=$!
FOR /F "tokens=1 delims=$" %%j in ('cmd.exe /C echo !LINE!') do echo %%j >> StartUp.txt
)
运行它之后,StartUp.txt应该包含程序的全名,每个程序都在各自的行上。构造'cmd.exe / C echo!LINE!'令人困惑。我把它作为我扫描LINE变量问题的解决方法。根据文档,它应该只是'!LINE!'但由于某种原因它不起作用......万一你感兴趣!VAR!语法,参见set /?
无论如何,批处理语言耗费大量时间,所以最好尽可能避免使用它,或者将它与awk,sed,autohotkey等一些严肃的工具结合使用......它们每个都可以解析reg命令的输出在一个正则表达式行中,autohotkey可以为它创建一个漂亮的GUI,你可以完全避免批处理脚本。
最后,不要忘记也可以为“所有用户”运行部分。