Batch file Can';t在CMD中使用for/f获取要设置的变量

Batch file Can';t在CMD中使用for/f获取要设置的变量,batch-file,for-loop,cmd,Batch File,For Loop,Cmd,这个剧本把我难住了。我正在尝试编写一个脚本,它接受最新的shadowcopy dir并将其放在一个var中。这就是我到目前为止所拥有的 @ECHO off set ShadowDir= vssadmin list shadows|for /f "tokens=4 delims=: " %%A IN ('FINDSTR "GLOBALROOT"') do set ShadowDir=%%A ECHO The dir is %ShadowDir% pause 这就是输出 C:\WINDOWS\sy

这个剧本把我难住了。我正在尝试编写一个脚本,它接受最新的shadowcopy dir并将其放在一个var中。这就是我到目前为止所拥有的

@ECHO off
set ShadowDir=
vssadmin list shadows|for /f "tokens=4 delims=: " %%A IN ('FINDSTR "GLOBALROOT"') do set ShadowDir=%%A
ECHO The dir is %ShadowDir%
pause
这就是输出

C:\WINDOWS\system32>set ShadowDir=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy14

C:\WINDOWS\system32>set ShadowDir=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy15

C:\WINDOWS\system32>set ShadowDir=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy16

C:\WINDOWS\system32>set ShadowDir=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy17

C:\WINDOWS\system32>set ShadowDir=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy18
The dir is
Press any key to continue . . .
正如您所看到的,它正在正确解析并提供所需的输出。但是ShadowDir变量仍然为空,即使发出set命令

知道发生了什么吗?

我会用

for /f "tokens=4 delims=: " %%A IN ('vssadmin list shadows^|FINDSTR "GLOBALROOT"') do set ShadowDir=%%A

vssadmin
输出传递到有效的
findstr

!谢谢,但出于好奇,你能解释一下原因吗?输出是按我的方式进行管道传输的,但变量仍然为空。因为管道导致管道两侧的进程分别在单独的cmd.exe会话中运行,所以这也不起作用:
echo value | set/P var=
。有关更多详细信息,请参阅我相信您正在将
vssadin
命令输出到
For
——但是
For
正在接受来自
findstr
的输入。
findstr
没有输入,因此它向
for
发送了一条错误消息,并且该错误消息没有使用
作为分隔符的第四个标记。因此,通过将
vssadmin
移动到要执行的命令中,
vssadmin
的输出被传递到
findstr
findstr
的输出到
,而不考虑屏幕报告(抱歉,无法复制),因此
%A
未建立,且未调用
set