我需要编写一个命令,它将更改当前目录并打印包含在某些标记中的NEW目录。我认为cd SOMEPATH & echo wkd%cd%wkd
会这样做但是有问题。
以下是一些示例输入和输出
C:\Users> cd .. & echo wkd%cd%wkd
wkdC:\Userswkd
如您所见,打印了OLD目录。为什么会这样? 我也尝试过使用换行符(因为我通过外部程序提供命令)但是在启动命令行软件时会出现问题。
我真的希望有一个解决方案。
答案 0 :(得分:1)
在批处理文件中,首先解析行或代码块(括在括号中的代码),然后执行,并在下一行/块上重复该过程。在解析阶段,从代码中删除从变量中获取值的所有读取操作,在开始执行代码之前用变量中的值替换。
在您的情况下,当解析行时,{C}替换为其值,然后再开始执行该行并更改文件夹。
备选方案:
cd .. echo wkd%cd%wkd
%cd%
更改为%var%
,告诉解析器读取操作应延迟到执行时间rem inside a batch file setlocal enabledelayedexpansion cd .. & echo wkd!cd!wkd rem from a command line cmd /v:on /q /c "cd .. & echo wkd!cd!wkd"
!var!
之前强制执行命令重新评估以获取正确的值。您可以使用echo
命令执行此操作。它有效,但call
比其他选项慢rem inside a batch file cd .. & call echo wkd%%cd%%wkd rem from command line cd .. & call echo wkd^%cd^%wkd
rem from command line cd .. & for %A in (.) do echo wkd%~fAwkd cd .. & for /f %A in ('cd') do echo wkd%Awkd rem in batch files the percent sign needs to be escaped cd .. & for %%A in (.) do echo wkd%%~fAwkd cd .. & for /f %%A in ('cd') do echo wkd%%Awkd
(call
是%~fA
可替换参数for
引用的元素的全名
以前代码中%A
和for /f
命令的工作方式有所不同
for
正在启动for /f
实例,该实例将执行cmd
命令以输出当前目录,该输出由cd
中的代码处理为每个输出行调用的子句,该行存储在可替换参数
do
直接检索对指定元素的引用,在本例中为for
,即当前文件夹。在这种情况下,.
用于从相对%~fA
引用获取真实全名到绝对路径
所有这些选项只做一件事:延迟检索当前文件夹,直到.
被执行。
答案 1 :(得分:0)
尝试一下:
cd .. & For /F %A in ('cd') do echo wkd%Awkd
for循环事件执行命令输出捕获,如下所示:Put command output into a variable
然后我只是用它周围的东西回应那个变量。
原始尝试不起作用的原因是%cd%环境变量在执行任何命令之前设置,并且在解释器完全转到下一个命令之前不会更改。它对待foo& bar作为单个命令有两个部分。