在 Windows 中,如何使用批处理文件显示启动项?
5 回答
您的启动项是您自己的项和“所有用户”项的组合。您可以通过以下方式找到自己的:
dir "%homedrive%%homepath%\start menu\progams\startup"
和“所有用户”(通常)具有:
dir "%homedrive%%homepath%\..\all users\start menu\progams\startup"
您所要做的就是操作文件名以删除路径和末尾的“.lnk”以获取快捷方式名称。
如果您cd
首先访问这些目录并且只执行 dir,则您甚至不必删除路径。
更新:
如果,正如您的评论似乎表明的那样,您希望所有事情都在系统启动时启动,那么它们无处不在。您需要获得一份Autoruns(或它的命令行兄弟 Autorunsc,用于您的目的)。
这是最好的方法,因为它得到了微软自己的“祝福”。
如果您可以使用 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()
"---------------------------------------"
}
编辑:-x
AUTORUNSC 上的参数使其输出 XML。
正如已经回答的那样,启动项是“所有用户”和当前用户的启动项的组合。启动项可以作为链接放置在“开始”菜单的“启动”文件夹中,也可以作为注册表项放置。
对于启动文件夹,您已经在 Pax 的答案中获得了路径,但请注意,在非英语版本的 Windows 中路径会有所不同。
对于注册表,我认为您不能仅使用批处理脚本来查询它。如果可以的话,可以通过 PowerShell 脚本来完成。否则,我认为完成该任务的最简单方法是为该任务制作一个小型实用程序。(用其中一种 .NET 语言很容易做到,或者如果不能依赖现有的 .NET Framework,也可以用 C 语言做到这一点)。
对于所有用户,可以在此处找到注册表条目:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
对于当前用户:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
最后,请注意注册表还包含 RunOnce 键;其中包含仅应在启动时运行一次然后被删除的条目。
“所有用户”似乎没有显示 MSConfig 中的内容。是否有查询注册表以获取 MSConfig 启动条目?
您可以使用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,你可以完全避免批处理脚本。
最后,不要忘记也可以运行“所有用户”部分。