2

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

4

5 回答 5

3

您的启动项是您自己的项和“所有用户”项的组合。您可以通过以下方式找到自己的:

dir "%homedrive%%homepath%\start menu\progams\startup"

和“所有用户”(通常)具有:

dir "%homedrive%%homepath%\..\all users\start menu\progams\startup"

您所要做的就是操作文件名以删除路径和末尾的“.lnk”以获取快捷方式名称。

如果您cd首先访问这些目录并且只执行 dir,则您甚至不必删除路径。

更新:

如果,正如您的评论似乎表明的那样,您希望所有事情都在系统启动时启动,那么它们无处不在。您需要获得一份Autoruns(或它的命令行兄弟 Autorunsc,用于您的目的)。

这是最好的方法,因为它得到了微软自己的“祝福”。

于 2009-04-13T11:00:15.543 回答
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()
  "---------------------------------------"
}

编辑-xAUTORUNSC 上的参数使其输出 XML。

于 2009-04-13T14:50:40.777 回答
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 键;其中包含仅应在启动时运行一次然后被删除的条目。

于 2009-04-13T11:52:07.413 回答
0

“所有用户”似乎没有显示 MSConfig 中的内容。是否有查询注册表以获取 MSConfig 启动条目?

于 2009-04-13T11:12:59.223 回答
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

在此之前,您需要用一些字符替换 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 命令的输出在一个单一的regexp 行,而 autohotkey 甚至可以为它创建一个漂亮的 GUI,你可以完全避免批处理脚本。

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

于 2009-04-13T12:45:18.363 回答