批处理文件显示启动项

时间:2009-04-13 10:47:04

标签: scripting batch-file startup

在Windows中,如何使用批处理文件显示启动项?

5 个答案:

答案 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,你可以完全避免批处理脚本。

最后,不要忘记也可以为“所有用户”运行部分。