2017-01-29 2 views
1

У меня есть bat-скрипт, который называется info.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 
) 

%x Но это C: и имя файла не может содержать «:», а затем я попытался

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:

Я хочу, чтобы создать файл для каждого диска, который содержит дерево диска в имени файла.

Как я могу это сделать?

ответ

2

Ваш код не работает, поскольку сменные параметры for не позволяют использовать операции подстроки. Необходимо сначала присвоить значение нормальной строке, а затем выполнить операцию подстроки в этой переменной.

Но, поскольку ваш код помещается внутри блока кода (в команде в команде 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 

Запросив LogicalDisk заголовок в формате списка, wmic возвращает строки в формате

Caption=C: 

tokens=2 delims==: делает for /f процессу линии, как

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

Как мы только просим второй токен, строки без по меньшей мере двух токенов отбрасываются (это означает, что skip теперь не требуется). Второй токен, буква диска без двоеточия, хранится в %%a, а в команде tree нам нужно включить удаленный двоеточие.

+0

Это работает! Большое спасибо за очень быстрый ответ. – FelixFrog

Смежные вопросы