在cmd中保存所有驱动器的树

时间:2017-01-29 11:34:36

标签: batch-file for-loop

我有一个名为info.bat

的.bat脚本
FOR /F "tokens=2 delims==" %%I IN ('wmic os get localdatetime /format:list') DO set datetime=%%I
set datetime=%datetime:~0,8%-%datetime:~8,6%


FOR /F "skip=1" %x IN ('wmic logicaldisk get caption') DO (
tree %x /A /F > info\info-drive-%%x-%datetime%.txt
)

%xC:且文件名不能包含":"然后我试了

FOR /F "skip=1" %x IN ('wmic logicaldisk get caption') DO (
set drive=%%x:~0,-1
tree %x\ /A /F > info\info-drive-%drive%-%datetime%.txt
)

我认为该驱动器将为C,但仍为C:

我想为包含文件名中磁盘树的每个驱动器创建一个文件。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您的代码无效,因为for可替换参数不允许使用子字符串操作。首先必须将值赋值给普通字符串,然后在此变量中执行子字符串操作。

但是,由于您的代码放在一个代码块(do命令中的for子句)中,您还需要延迟扩展才能检索变量的值在街区内。

并且,由于wmic命令的输出包括额外的行(跳过和结束的标题"空白"行),您需要过滤其输出以仅检索正确的行(在此示例中,包含冒号的行)

@echo off
    setlocal enableextensions enabledelayedexpansion

    for /f "tokens=2 delims==" %%a in ('
        wmic os get localdatetime /format:list
    ') do set "dateTime=%%a"
    set "datetime=%datetime:~0,8%-%datetime:~8,6%"

    for /f %%a in ('
        wmic logicaldisk get caption
        ^| find ":"
    ') do (
        set "drive=%%a"
        set "drive=!drive:~0,1!"
        >"info\info-drive-!drive!-%dateTime%.txt" tree %%a\ /a /f
    )

更简单的替代方法是直接删除包含它的冒号作为for /f选项中的分隔符,然后在需要的命令中包含冒号。

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f "tokens=2 delims==" %%a in ('
        wmic os get localdatetime /format:list
    ') do set "dateTime=%%a"
    set "datetime=%datetime:~0,8%-%datetime:~8,6%"

    for /f "tokens=2 delims==:" %%a in ('
        wmic logicaldisk get caption /format:list
    ') do >"info\info-drive-%%a-%dateTime%.txt" tree %%a:\ /a /f

通过以列表格式请求逻辑磁盘标题,wmic

格式返回行
Caption=C:

tokens=2 delims==:使for /f处理行为

1       2 
v       v .......... Tokens
Caption=C:
       ^ ^ ......... Delimiters

由于我们只请求第二个令牌,所以没有至少两个令牌的行被丢弃(这意味着现在不需要skip)。第二个标记,没有冒号的驱动器号存储在%%a中,在tree命令中我们需要包含删除的冒号。