我正在移植一个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 。