【问题标题】:Nested for loop with if statement in batch file在批处理文件中使用 if 语句嵌套 for 循环
【发布时间】:2012-03-22 15:59:07
【问题描述】:

我知道这个问题可能已经被讨论了数千次,但我不知道我做错了什么!

我有以下 bat 文件脚本,它尝试根据 PID 对与 %PROCNAME% 变量匹配的所有当前进程执行内存转储。它似乎可以执行我需要的操作,直到我回显%DUMFILENAME%。在这里它打印上一次迭代的PID 变量的PID ...

例如如果我有 3 个记事本实例(PID 为 1、2、3)正在运行并且我运行以下 bat。我在命令提示符下得到以下输出:

"Current PID is 1"

C:\Documents and Settings\userme\Local Settings\Application Data\notepad\notepad.exe_Thu 03222012204843.02.dmp

"Current PID is 2"

C:\Documents and Settings\userme\Local Settings\Application Data\notepad\notepad.exe_1_Thu 03222012204843.02.dmp

"Current PID is 3"

C:\Documents and Settings\userme\Local Settings\Application Data\notepad\notepad.exe_2_Thu 03222012204843.02.dmp

我的 bat 脚本:

@echo off
SETLOCAL EnableDelayedExpansion
SET PROCNAME=notepad.exe
FOR /F "tokens=1 delims=," %%A in ('tasklist /FI "IMAGENAME eq %PROCNAME%" /FO LIST') DO (
      set "maintoken=%%A"
      Call:InnerToken !maintoken!)
pause
goto :end
:InnerToken
set innertoken=%1
IF "%innertoken%"=="PID:" (
      FOR /F "tokens=1,2 delims=:" %%B in ("%innertoken%") DO (
         set "res=%~n2"
         echo "Current PID is !res!"
         SET "DUMPFILENAME=%USERPROFILE%\Local Settings\Application Data\Notepad\%PROCNAME%_!res!_%date:/=%%time::=%.dmp"
         echo %DUMPFILENAME%
         )
      )
:end

任何帮助将不胜感激...

【问题讨论】:

    标签: for-loop command-prompt batch-file


    【解决方案1】:

    使用

    echo !DUMPFILENAME!
    

    改为。

    这让我很惊讶,因为您似乎已经知道在块中设置和使用变量时需要延迟扩展。

    【讨论】:

    • 这是否意味着当我使用延迟扩展变量(如!res!)创建另一个局部变量(如DUMPFILENAME)时,我应该将DUMPFILENAME 也视为延迟扩展变量?我真的不知道这个。
    • cmd 不是电子表格,不会跟踪您的变量从何处获得其值。延迟扩展是必要的,因为在解析语句时会扩展变量(如果它是或包含块,则计为单个语句)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多