将批处理输出重定向到 cd 命令

将批处理输出重定向到 cd 命令

我有一个输出路径的批处理文件。如何在 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

对于不同的驱动程序,您需要/dcd命令中

如果您的文件夹/路径/名称有任何空格/特殊字符,也请使用“双引号”

@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

答案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,则脚本退出时您将返回到起始目录。

一个解决方案是将endlocalcd命令放在同一行。批处理文件的解析方式意味着评估MYPATH环境仍然是“本地”时发生(因此它仍然具有正确的值),但是执行命令cd(使用第一遍获得的值)直到endlocal执行后才会发生,这意味着目录将要当返回命令行时会发生改变。

我定义 和使用其值(用双引号括起来)的方式MYPATH允许路径包含空格。这里可能没有必要,但在编写批处理文件时养成一个好习惯。

作为最后一个选项,您可以用 替换cd /dpushd后者在切换到新目录之前将当前目录“推送”到堆栈上(请参阅pushd /?)。当您完成需要在 中执行的任何操作后,MYPATH您可以运行popd以返回到最初运行的目录my-path .

相关内容