命令提示符 - 初始当前目录设置

命令提示符 - 初始当前目录设置

重新安装操作系统(现在是 Win 10 Home build 19042)后,我发现当我cmd.exe从桌面“快捷方式”启动时,我的某个驱动器上的当前目录不是像过去那样的根目录,而是一个经常使用的目录。

@ECHO OFF
SETLOCAL
:: Show current directory for all drives
FOR %%b IN (%alphabet%) DO IF EXIST %%b:. FOR /f "tokens=2*delims= " %%h IN ('dir %%b:. ^|find "\"') DO ECHO %%i

当快捷方式启动cmd.exe实例时运行此批处理将产生以下结果:

c:\106x
D:\
E:\
F:\
L:\
M:\neo
N:\
U:\
V:\

我知道C:- 这是“起始于”目录。M:问题就出在这个目录上。虽然这是我经常使用的目录,但在过去(重新安装之前),我相信当前目录M:是根目录,与所有其他驱动器一样。

我无法找到任何似乎指定目录的设置 -M:\neo注册表中没有提及。

经过整整两天尝试将我的系统恢复到我的设置后,这个问题让我很为难。

更新 20210702T113000Z

经过至少三次重启后,问题现已消失。

答案1

此行为表明进程cmd.exe正在继承一个环境块,其中包含=M:值为 的环境变量M:\neo。此类隐藏的环境变量由命令处理器内部使用跟踪每个驱动器的当前目录。如​​果 Explorer 将它们传递给新的cmd.exe,则表明 Explorer 是从命令提示符(可能间接地)启动的,而命令提示符在 M 驱动器上的最后一个当前目录是M:\neo。我可以使用以下步骤重现此行为:

  1. 打开命令提示符M:\neo
  2. 终止 Explorer,例如使用taskkill /im explorer.exe /f
  3. 从打开的命令提示符重新启动explorer。Explorer 的此实例继承了所有命令处理器的环境变量。
  4. 从资源管理器启动新的命令提示符,例如使用快捷方式或运行对话框。此提示符在 M 驱动器上的当前目录也将是M:\neo

如果禁用 UAC,则可以想象从命令行启动的任务管理器实例也可能是“环境块保管链”的一部分,并在某些时候用于重新启动 Explorer。(注意:未测试,因为我已启用 UAC。)

您可以通过启动 PowerShell 并评估 来验证 Explorer 是否传递了每个驱动器的当前目录变量${env:=M:},因为 PowerShell 本身不会设置这些变量。但如果变量不存在或为空,则当前目录可能受到以下脚本的影响:命令处理器 AutoRun 命令。可以通过cmd /d从运行对话框启动来在注册表中查看它们或暂时禁用它们。

我理解问题对你来说已经解决了,但是万一它再次出现(并且为了其他人的利益),你可以尝试通过查看进程树来调查环境继承进程探索器。如果启动 Explorer 的进程仍在运行,它将在左侧树中显示为 Explorer 的父进程,您将能够看到有关它的许多详细信息。但万一父进程已经结束,您需要启用流程审计,重新启动,并跟踪事件 4688 的实例,以查明哪些进程链(可能涉及批处理脚本)创建了当前正在运行的 Explorer 实例。

相关内容