我有这个批次获得可用空间关于我的系统所拥有的设备及其名称(C:\
,D:\
等)。
for /f "tokens=2 delims==" %%I in (
'wmic LOGICALDISK get FreeSpace /format:list 2^>NUL'
) do (sqlcmd -v varSpace="%%I" column="FIELD1" -i C:\cmdutils\test.sql)
for /f "tokens=2 delims==" %%U in (
'wmic LOGICALDISK get name /format:list 2^>NUL'
) do (sqlcmd -v varSpace="%%U" column="FIELD2" -i C:\cmdutils\test.sql)
sql文件执行插入:
USE [BBDD_SYSTEM]
INSERT INTO SYS_TABLE ($(column)) VALUES ('$(varSpace)')
问题是第一次循环插入3行(我有3个磁盘),可用空间和第二个循环插入3行更多名称,共6行
正确操作共有3行,空格和名称。
我如何加入这两个循环?
答案 0 :(得分:1)
使用WMIC
:
@echo off
for /f "tokens=1,2 delims= " %%a in ('wmic LOGICALDISK get freespace^,name /format:table ^| findstr "[0-9] :"') do (
echo Do something SQL with Drive : [%%b] Free : [%%a]
)
另一种方法是使用DIR
中的Find "Bytes "
命令来获取2个变量:
@echo off
setlocal enabledelayedexpansion
set /a $c=1
set "$drive=c: d: e:"
for %%a in (%$Drive%) do (
for /f "tokens=3 delims= " %%b in ('2^>nul dir %%a ^|find "bytes "') do (
echo Do something SQL with Drive : [%%a] Free : [%%b]
)
)
答案 1 :(得分:1)
您可以组合使用的两个wmic
命令行,如下所示:
for /F "skip=1 tokens=1,2,3 delims= " %%I in ('
2^> nul wmic LOGICALDISK GET FreeSpace^,Name^,Size /FORMAT:TABLE
') do (
if not "%%K"=="" (
sqlcmd -v varSpace="%%I" column="FIELD1" -v varName="%%J" column="FIELD2" -i C:\cmdutils\test.sql
)
)
以表格格式返回了3个字段FreeSpace
,Name
,Size
。第一行被for /F
跳过,因为它是标题。然后,只提取了前两个字段FreeSpace
和Name
,但Size
不是;刚刚添加了这个,以便所需的字段Name
不是最后一个,因为wmic
生成Unicode输出,for /F
正确转换为ANSI但不是最后一个字段。< / p>
if not "%%K"==""
查询旨在过滤掉未格式化的磁盘。对于此类磁盘,FreeSpace
和Size
都为空,因此只有一个令牌Name
。
<强>注意:强>
我绝对不确定sqlcmd
命令行,实际上我只是在猜测。
答案 2 :(得分:1)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "tokens=1*delims==" %%a IN (
'wmic LOGICALDISK get FreeSpace^,name /format:list'
) DO (
IF /i "%%a"=="Freespace" SET "free=%%b"
IF /i "%%a"=="Name" (
SET "name=%%b"
ECHO sqlcmd -v varSpace="!free:~0,-1!" column="FIELD1" -v varSpace="!name:~0,2!" column="FIELD2" -i C:\cmdutils\test.sql
)
)
GOTO :EOF
这对我有用,但我不确定sqlcmd
语法(sqlcmd
只是echo
编辑)