将shell函数移植到cmd.exe:是否可以在启动时自动获取脚本?

我正在移植一个Linux工具集,频繁使用shell函数来提供某些function。 这些函数是在你启动一个新的shell的时候自动获得的,包括改变工作目录等,这对于独立程序几乎是不可能的,因为subprocess不能改变父进程的环境。

例如,有一个cdbm函数可以将工作目录更改为之前添加了书签的目录。 现在我想在Windows上做同样的事情,但我坚持使用cmd.exe 。 据我了解脚本可以移植到jscript,VBScript或简单的批处理,这应该不成问题。 但是,如何确保它们在启动时自动获取并在shell的环境中生活?

根据help cmd

如果/ D没有在命令行中指定,那么当CMD.EXE启动时,
查找以下REG_SZ / REG_EXPAND_SZ注册表变量,如果
他们中的任何一个或两个都存在,他们首先执行。

     HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Command Processor \ AutoRun

        和/或

     HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor \ AutoRun

作为一个测试,在regedit我在上面显示的名为“AutoRun”的HLM分支中创建了一个新字符串,字符串值为“echo Hi”。 当我开始一个新的cmd实例时,我得到:

 Microsoft Windows [版本6.0.6000]
版权所有(c)2006 Microsoft Corporation。 版权所有。
你好

 C:\ Users \用户名>

你可以把一个脚本的名字,而不是运行(我会把一个完全指定的脚本的路径或一个环境变量,像“%HOMEPATH%\脚本\脚本名称”(包括引号的情况下空间中的名字)。

编辑:注册表项有一些副作用。 一个例子是help 。 例如,如果我有上面的echo命令,例如在自动运行时,当我输入help vol我会在帮助文本上方看到一个“Hi”。 做vol /? ,虽然不这样做。

CMD启动时,您可以将以下任一注册表项设置为批处理文件或其他可执行文件来运行该程序:

 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun 

批处理文件应该能够使用CD命令更改正在执行的CMD进程的当前目录,因为它不作为子进程运行。 您可以通过将/D作为开关提供给CMD来禁用自动运行行为。

CMD /? 更多细节。

由于cmd不允许你在全局范围内定义函数,所以我有点不知所措,在启动时通过自动获取脚本来实现你想要实现的目标。 我倾向于在我的路径中包含一个批处理文件目录,您可以放置​​我经常需要的批处理文件。

看看cygwin 。