我有一个输出路径的批处理文件。如何在 Windows cmd 中使用批处理文件更改当前目录?
我尝试过什么:
F:\>cd my-path.bat
The system cannot find the path specified.
F:\>cd (my-path.bat)
The system cannot find the path specified.
F:\>my-path.bat | cd
F:\
The process tried to write to a nonexistent pipe.
my-path.bat内容:
@ECHO OFF
@ECHO F:\MyPath\
答案1
for /f "delims=" %d in ('my-path.bat') do cd /d "%~d"
注意:在批处理文件中,必须将 % 替换为 %%
答案2
对于不同的驱动程序,您需要/d
在cd
命令中
如果您的文件夹/路径/名称有任何空格/特殊字符,也请使用“双引号”
@echo off
echo\"F:\path to your folder"
:: or add/replace echo\"F:\path to your folder" to cd /d ::
cd /d "F:\path\to\folder"
另一种方法是通过循环获取输出,其中 bat 不会改变,只会改变命令行......
for /f tokens^=* %i in ('^<con: "my-path.bat"')do cd/d "%~i"
%i
记住bat 中的循环变量是%%i
:
for /f tokens^=* %%i in ('^<con: "my-path.bat"')do cd/d "%%~i"
- 您可以使用参数(
%*
)来变量运行您的命令:
@echo off
<con: call %* "F:\path to your folder" 2>nul || echo\"F:\path to your folder"
抑制2>nul
任何可能的错误,并且如果最后一个命令不返回 0,则一个简单的回声将采取行动......
在你的蝙蝠中使用参数:
my-path.bat cd /d
进一步阅读:
[√]'Cd/d'
[√]'为了'
[√]“对于/F”
[√]bat 文件中的重定向
[√]条件执行
||
和&&
答案3
为什么不简单地将批处理文件更改为:
@echo off
cd F:\MyPath\
答案4
构建于LeRouteur 的回答,以下可能是一个有用的折衷方案:
@echo off
if "%~1" == "." cd /d F:\mypath && goto :eof
echo F:\mypath
运行只会my-path
回显路径,就像现在一样,但是运行my-path .
(即以单个句号作为参数)将改变到该路径。
如果您不喜欢输入两次路径,可以使用环境变量来避免这种情况,但要“干净地”这样做(不污染您现有的环境)需要一点思考:
@echo off
setlocal
set "MYPATH=F:\mypath"
if "%~1" == "." (
endlocal && cd /d "%MYPATH%"
goto :eof
)
echo "%MYPATH%"
使用setlocal
意味着对环境的任何更改(例如MYPATH
)都只能在本地进行:运行endlocal
或到达批处理文件的末尾将恢复到原始环境(参见setlocal /?
和endlocal /?
)。
在批处理文件中使用setlocal
非常常见,因此它们使用/更改的任何环境变量都不会“污染”主环境。问题是当前目录cd
是本地化的一部分:如果在有效时运行setlocal
,则脚本退出时您将返回到起始目录。
一个解决方案是将endlocal
和cd
命令放在同一行。批处理文件的解析方式意味着评估当MYPATH
环境仍然是“本地”时发生(因此它仍然具有正确的值),但是执行命令cd
(使用第一遍获得的值)直到endlocal
执行后才会发生,这意味着目录将要当返回命令行时会发生改变。
我定义 和使用其值(用双引号括起来)的方式MYPATH
允许路径包含空格。这里可能没有必要,但在编写批处理文件时养成一个好习惯。
作为最后一个选项,您可以用 替换cd /d
。pushd
后者在切换到新目录之前将当前目录“推送”到堆栈上(请参阅pushd /?
)。当您完成需要在 中执行的任何操作后,MYPATH
您可以运行popd
以返回到最初运行的目录my-path .
。