如何使用 BAT 文件更改目录?

Posted

技术标签:

【中文标题】如何使用 BAT 文件更改目录?【英文标题】:How to change directory with BAT file? 【发布时间】:2022-01-09 03:09:25 【问题描述】:

我希望在运行这个 bat 文件时,下面的代码会在 C:\Users\zjafri\Desktop\Arthur\Runner2 目录中打开,但它会打开到我的桌面目录。

有人知道为什么吗?

%windir%\system32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3
CD C:\Users\zjafri\Desktop\Arthur\Runner2

控制台输出为:

C:\Users\zjafri\Desktop>C:\windows\system32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3

(base) C:\Users\zjafri\Desktop>

【问题讨论】:

【参考方案1】:

使用的命令行对于激活 Anaconda 环境的期望行为是错误的,将特定目录设为当前目录并保持命令进程运行以手动输入更多要执行的命令。

批处理文件是一个脚本。脚本需要脚本解释器可执行文件。 Windows 批处理文件的解释器是 Windows 命令处理器 cmd.exe,它具有完整的限定文件名 %SystemRoot%\System32\cmd.exe%ComSpec%SystemRootComSpec 是两个预定义的Windows Environment Variables。

Windows 命令处理器在启动可执行文件时暂停批处理文件的处理,直到启动的可执行文件自行终止。

cmd.exe 实例处理批处理文件执行以下命令行时会发生什么?

%windir%\system32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3

Windows 命令处理器再启动一个命令进程来处理另一个批处理文件,并在批处理文件执行完成后保持运行,因为选项/K 被无用地括在双引号中。因此,cmd.exe 的第二个启动实例不会自行终止。出于这个原因,cmd.exe 的第一个实例等待并等待cmd.exe 的第二个实例终止,然后继续处理批处理文件并读取下一个命令行。

因此,只有当用户在第二个命令进程中键入exit 以终止第二个cmd.exe 实例时,第一个命令进程才会执行命令行CD C:\Users\zjafri\Desktop\Arthur\Runner2

一种解决方案是在批处理文件中使用以下命令行:

call "C:\ProgramData\Anaconda3\Scripts\activate.bat" "C:\ProgramData\Anaconda3"
cd /D "%UserProfile%\Desktop\Arthur\Runner2"

这个批处理文件导致执行批处理文件activate.bat,接下来执行命令CD,然后批处理文件的处理就完成了。

接下来会发生什么取决于批处理文件的启动方式。如果只是双击批处理文件,Windows 调用cmd.exe 并使用隐式选项/C 来执行批处理文件,然后关闭 命令进程。因此,双击批处理文件时,会打开一个控制台窗口,执行两个命令行,并且控制台窗口会在 cmd.exe 自行终止时关闭。

但是,如果用户打开了command prompt,这意味着使用隐式选项/K 启动cmd.exe,并在命令提示符窗口中通过键入完整的限定文件名来执行批处理文件(不带补全或不带补全)在输入文件夹/文件名的几个字符后点击一次或多次 TAB 来帮助,然后点击 RETURNENTER 来执行批处理文件,命令提示符窗口保持打开状态,Anaconda 环境被激活,目录%UserProfile%\Desktop\Arthur\Runner2 是当前目录。

好吧,首先打开命令提示符窗口并手动运行带有完整路径的批处理文件并不是很方便。批处理文件可以使用短文件名存储在其中一个文件夹中,该文件夹的路径存在于环境变量 PATH 的值中,例如 Windows 目录。这样就可以打开命令提示符,只需键入批处理文件的文件名,然后按 RETURNENTER 键即可执行它。

另一个方便的解决方案是在用户桌面上创建一个文件名为Anaconda3 的快捷方式文件 (*.lnk),在该快捷方式的属性中配置:

目标: %SystemRoot%\System32\cmd.exe /K C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3开始于: C:\Users\zjafri\Desktop\Arthur\Runner2评论: Opens a command prompt and activates Anaconda3 in Runner2

使用快捷方式文件有多种优势。 快捷键可以定义为启动 Windows 命令处理器并执行批处理文件以激活 Anaconda 环境,这与当前具有输入焦点的应用程序以及桌面是否位于应用程序窗口或所有其他窗口的前面。在快捷方式属性的 选项字体布局颜色选项卡上,可以定义选项和外观应该在使用 Anaconda 时使用它,例如使用具有更多行/列和默认较大字体的控制台窗口。

虽然使用快捷方式文件肯定是这个用例的最佳解决方案,但也可以通过双击运行批处理文件打开命令提示符窗口执行批处理文件来激活 Anaconda 环境并保持命令进程运行,当前目录设置为想要的目录。

这样的批处理文件只需要一个命令行:

@start "Anaconda3" /D"%UserProfile%\Desktop\Arthur\Runner2" %ComSpec% /K C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3

在这种情况下,cmd.exe 使用此命令行处理批处理文件会启动一个带有选项 /K 的新命令进程,以在执行批处理文件后通过以 Anaconda3 为标题的启动 cmd.exe 保持命令进程运行对于新的控制台窗口,并在启动 cmd.exe 之前将目录 CD C:\Users\zjafri\Desktop\Arthur\Runner2 设置为当前目录。在这种情况下,cmd.exe 不会等待启动的第二个 cmd.exe 终止,因此使用此单个命令行处理批处理文件的 cmd.exe 实例会立即终止。

这种批处理文件解决方案的缺点是用户无法配置在激活 Anaconda 环境后继续运行的命令进程的选项、字体、布局、颜色。

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

call /? cd /? cmd /? start /?

PS:我没有安装 Anaconda 也没有阅读它的文档。所以我不知道在执行C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3 时会发生什么以及执行此批处理文件后的当前目录是什么。如果批处理文件编码良好并且参数C:\ProgramData\Anaconda3 并不意味着将当前目录更改为该目录,那么一切都应该按照上面的说明进行。否则,提供的解决方案需要根据 activate.bat 对环境的更改进行调整,即当它更改当前目录时。

【讨论】:

【参考方案2】:

在 cmd 命令(连接)之前执行 cd 命令并将其全部包装在代码块中。

(CD C:\Users\zjafri\Desktop\Arthur\Runner2 & cmd.exe /K C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3)

【讨论】:

以上是关于如何使用 BAT 文件更改目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 powershell 中更改目录并在该目录中运行文件?

.bat如何才能后台运行

使用 python 更改 .bat 文件

打开.bat文件脚本后如何保持cmd运行

如何更改tomcat7及以上版本内存设置

如何使用 .bat 更改桌面壁纸