Windows批处理中如何将p4命令输出结果存入变量?
解决批处理中获取Perforce客户端根目录的问题
问题重现
在命令行直接执行p4 -F %clientRoot% -ztag info能正常返回客户端根目录,但写入批处理后用常规方案无法将结果赋值到变量:
for /f %%i in (p4 -F %%clientRoot%% -ztag info) do set src=%%i
执行echo %src%返回ECHO is off,说明变量未被正确赋值;若去掉@echo off则会提示无法找到文件——这是因为for /f默认把括号内内容当作文件名处理,而非要执行的命令。
另外,直接将命令存为变量的方式也无法实现路径拼接:
set p4root=p4 -F %%clientRoot%% -ztag info set src=%p4root%\Development echo %src%
输出为p4 -F %clientRoot% -ztag info\Development\,只是单纯的字符串拼接,并未执行命令获取真实路径。
正确解决方法
1. 修正for /f命令格式
for /f执行外部命令时,需要用单引号包裹命令,同时注意批处理中%的转义规则,还要保留路径中的空格:
@echo off for /f "delims=" %%i in ('p4 -F %%clientRoot%% -ztag info') do set "src=%%i" echo %src%
delims=:避免路径含空格时被截断,完整保留输出内容('命令'):让for /f识别括号内为待执行的命令,而非文件名set "src=%%i":用引号包裹赋值语句,防止路径末尾的空格被忽略
2. 直接拼接src文件夹路径
如果需要直接得到根目录下的src文件夹,可在赋值时完成拼接:
@echo off for /f "delims=" %%i in ('p4 -F %%clientRoot%% -ztag info') do set "src=%%i\src" echo %src%
完整验证示例
@echo off cls :: 获取Perforce客户端根目录 for /f "delims=" %%i in ('p4 -F %%clientRoot%% -ztag info') do set "p4_root=%%i" :: 拼接目标src文件夹路径 set "src_dir=%p4_root%\src" echo Perforce客户端根目录: %p4_root% echo 目标src文件夹路径: %src_dir% pause
执行后会正确输出真实的路径结果,不会出现字符串原样输出的问题。
内容的提问来源于stack exchange,提问作者rasonage
相关产品推荐
相关产品推荐

