batch-file - 为什么调用 echo 输出到文件时结果会加倍?
问题描述
我正在尝试生成有关磁盘/驱动器的 DiskDevices.ini 文件。
这是我的批次。
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
SET "InputFile=DiskDevices.ini"
IF EXIST "%InputFile%" (DEL /f /q "%InputFile%")
SET /A "TotalDevices=0"
SET /A "Index=0"
@FOR /F "skip=2 tokens=*" %%G IN ('
"WMIC PATH Win32_DiskDrive GET Index /format:csv 2>NUL"
') DO (
SET /A "TotalDevices=TotalDevices+1"
SET /A "Index=Index+1"
>>"%InputFile%" CALL ECHO [Device_%%Index%%]
@FOR /F Tokens^=* %%G IN ('
"WMIC PATH Win32_DiskDrive GET Caption,Size /value 2>NUL"
') DO (
@FOR /F Tokens^=* %%H IN ("%%G") DO (>>"%InputFile%" CALL ECHO %%H)
)
)
>>"%InputFile%" CALL ECHO [Total Devices]
>>"%InputFile%" CALL ECHO Value=%%TotalDevices%%
PAUSE
结果是循环两次。
[Device_1]
Caption=Samsung EVO
Size=162536803840
Caption=Kingston USB Device
Size=31718510080
[Device_2]
Caption=Samsung EVO
Size=162536803840
Caption=Kingston USB Device
Size=31718510080
[Total Devices]
Value=2
我需要同样的:
[Device_1]
Caption=Samsung EVO
Size=162536803840
[Device_2]
Caption=Kingston USB Device
Size=31718510080
[Total Devices]
Value=2
感谢帮助。
解决方案
好吧,你已经嵌套了两个for /F
收集基本相同信息的循环,这就是你得到重复的原因。
这种方法怎么样,它使用标题的Index
属性[Device_#]
以及where
内部wmic
查询的子句:
@echo off
set "COUNT=0"
> "DiskDevices.ini" (
for /F "delims=" %%J in ('wmic DiskDrive get Index /VALUE 2^> nul') do (
for /F "tokens=2 delims==" %%I in ("%%J") do (
echo [Device_%%I]
for /F "delims=" %%H in ('wmic DiskDrive where "Index=%%I" get Caption^,Size /VALUE 2^> nul') do (
for /F "delims=" %%G in ("%%H") do (
echo(%%G
)
)
set /A "COUNT+=1"
)
)
echo [Total Devices]
call echo Value=%%COUNT%%
)
推荐阅读
- php - 检查令牌是否在 Laravel 中过期
- javascript - 类型错误:db.close 不是函数
- android - 从 worldcam travel API 预览直播视频
- node.js - 尝试通过云功能将文件从存储上传到 FTP 服务器时超时
- javascript - ( Opencart v2.3 ) 在 iphone 中清空 (minicart) 中的所有购物车项目
- mysql - 在 MySQL 中使用多个 JOIN 表声明一个变量
- javascript - Listen / Observe - 使用 store.js 更改 LocalStorage
- php - 在循环中获取数组的增量
- unix - 在 Solaris 中使用 exec 的 fcntl()
- three.js - 带有 alpha 通道的 THREE.WebGLRenderTarget 中的颜色比预期的要暗