【问题标题】:Batch Reading File into Variable not working将文件批量读入变量不起作用
【发布时间】:2015-05-20 11:46:24
【问题描述】:

我正在尝试使用文件作为中介将命令输出重定向到变量。我能够将命令输出重定向到文件,但无法将文件内容读入变量。

批处理文件脚本

echo off

pushd C:\Software
set TEMP_DIR=C:\Users\prade\Softwares

for /D %%i in (*) do (
    pushd "%%i"
    echo %TIME% > %TEMP_DIR%\a.log
    type %TEMP_DIR%\a.log
    for /f "delims=" %%x in (%TEMP_DIR%\a.log) do set duration=%%x
    echo %%i  %duration%
    popd
)
popd
echo on

我给了我下面的输出

C:\Users\prade>echo off
 7:36:47.86
AutoHotKey
 7:36:47.86
cygwin64
 7:36:47.86
ffmpeg-20150518-git-451be67-win64-static
 7:36:47.86
mtn-200808a-win32
 7:36:47.86
ProcessExplorer
 7:36:47.86
tools

如您所见,目录名称后没有任何内容,但 type 给了我文件内容。

如果我echo %duration% 在批处理文件在同一个 cmd 窗口中终止后,它会给我最后一次。

我做错了什么?

【问题讨论】:

  • 你掉进了delayed expansion trap
  • @Stephan,谢谢。总有一些新东西要学。 :)
  • @Stephan,这是否意味着我应该一直使用! 而不是%,使用! 而不是% 有什么危害和性能影响吗?
  • 发现这个link 解释了setlocal enableDelayedExpansion 的作用。基于此,我假设它应该一直使用,除非我们在解析时有特殊需要扩展。对吗?
  • 不,只是另一个是圆的:仅使用延迟变量,如果您在执行时有特定需要扩展。 this question的答案和cmets中有一些有趣的链接

标签: windows batch-file cmd


【解决方案1】:
@echo off

pushd C:\Software
set "TEMP_DIR=C:\Users\prade\Softwares"

setlocal enableDelayedExpansion
for /D %%i in (*) do (
    pushd "%%i"
    echo %TIME% > "%TEMP_DIR%\a.log"
    type %TEMP_DIR%\a.log
    for /f "usebackq delims=" %%x in ("%TEMP_DIR%\a.log") do set "duration=%%x"
    echo %%i  !duration!
    popd
)
popd
echo on

【讨论】:

    【解决方案2】:

    ECHO OFF 下方添加SETLOCAL EnableDelayedExpansion 并使用!duration! 而不是%duration% 访问duration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 2013-10-27
      • 2015-11-29
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      相关资源
      最近更新 更多