我有一个名为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
)
但%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:
我想为包含文件名中磁盘树的每个驱动器创建一个文件。
我该怎么做?
答案 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
命令中我们需要包含删除的冒号。