Scripting 批处理文件显示启动项

Scripting 批处理文件显示启动项,scripting,batch-file,startup,Scripting,Batch File,Startup,在Windows中,如何使用批处理文件显示启动项目?您的启动项目是您自己的项目和所有用户项目的组合。您可以通过以下方式找到自己的: dir "%homedrive%%homepath%\start menu\progams\startup" 以及所有用户,通常包括: dir "%homedrive%%homepath%\..\all users\start menu\progams\startup" 您所要做的就是操纵文件名以删除路径,并在最后删除.lnk以获得快捷方式名称 如果您先cd到这

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

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

dir "%homedrive%%homepath%\start menu\progams\startup"
以及所有用户,通常包括:

dir "%homedrive%%homepath%\..\all users\start menu\progams\startup"
您所要做的就是操纵文件名以删除路径,并在最后删除.lnk以获得快捷方式名称

如果您先cd到这些目录,然后只执行dir,您甚至不必删除路径

更新:

如果,正如你的评论所表明的,你想要所有在系统启动时启动的东西,那么到处都可以找到它们。出于您的目的,您需要获取或其命令行兄弟autorunc的副本


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

所有用户似乎都没有显示MSConfig中的内容。
是否仍要查询注册表以获取MSConfig启动项?

如前所述,启动项是所有用户和当前用户的启动项的组合。启动项可以作为“开始”菜单“启动文件夹”中的链接或注册表项放置

对于启动文件夹,您已经在Pax的回答中获得了路径,但是请注意,在非英语版本的Windows中,路径将不同

对于注册表,我认为您不能仅使用批处理脚本查询它。可以从PowerShell脚本执行此操作,如果这是一个选项的话。否则,我认为完成任务最简单的方法是为任务编写一个小型实用程序。用一种.NET语言很容易做到,如果不能依赖现有的.NET框架,也可以用C语言做到

可在此处找到所有用户的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
对于当前用户:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
最后,请注意注册表还包含RunOnce键;其中包含的条目在启动时只应运行一次,然后将其删除。

您可以使用命令查询相应的注册表项:

reg QUERY HKCU\Software\Microsoft\Windows\CurrentVersion\Run > 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!”!排队这令人困惑。我把它作为解决扫描行变量问题的方法。根据文件,它应该只是'!排队但由于某种原因它不起作用。。。以防你感兴趣!瓦尔!语法,请参见set/

无论如何,批处理语言占用了大量的时间,所以最好尽可能避免使用它,或者将它与一些严肃的工具(如awk、sed、autohotkey等)结合使用。。。它们中的每一个都可以在单个regexp行中解析reg命令的输出,而autohotkey甚至可以为它创建一个漂亮的GUI,并且u可以完全避免批处理脚本


最后,别忘了也可以为所有用户运行部分。

如果您可以使用PowerShell,下面是一些使用的代码


编辑:autorunc上的-x参数使其输出XML。

@James,这应该是对我的答案的注释,而不是答案本身。无论哪种情况,请参阅我的更新。
$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()
  "---------------------------------------"
}