Batch file 批处理-用于循环-将循环中的两个变量设置为sqlcmd

Batch file 批处理-用于循环-将循环中的两个变量设置为sqlcmd,batch-file,for-loop,sqlcmd,Batch File,For Loop,Sqlcmd,我有这批人,他们获得了关于我的系统所拥有的设备及其名称的可用空间(C:\,D:\,等等) sql文件执行插入操作: USE [BBDD_SYSTEM] INSERT INTO SYS_TABLE ($(column)) VALUES ('$(varSpace)') 问题是第一个循环插入3行(我有3个磁盘)具有可用空间,而第二个循环插入3行具有名称,总共6行 正确的操作总共是3行,带有空格和名称 如何连接这两个循环?使用WMIC: @echo off for /f "tokens=1,2 de

我有这批人,他们获得了关于我的系统所拥有的设备及其名称的可用空间(
C:\
D:\
,等等)

sql文件执行插入操作:

USE [BBDD_SYSTEM]
INSERT INTO SYS_TABLE ($(column)) VALUES ('$(varSpace)')
问题是第一个循环插入3行(我有3个磁盘)具有可用空间,而第二个循环插入3行具有名称,总共6行

正确的操作总共是3行,带有空格和名称


如何连接这两个循环?

使用
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
命令获取两个变量:

@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]
  )
)

使用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
命令获取两个变量:

@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]
  )
)

您可以组合使用的两个
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
。对于/F
跳过第一行,因为它是标题。然后只提取前两个字段
FreeSpace
Name
,但不提取
Size
;这是刚刚添加的,因此所需字段
Name
不是最后一个字段,因为
wmic
生成Unicode输出,并且
for/F
正确转换为ANSI,但不是最后一个字段

如果不是“%%K”==”
查询旨在筛选出未格式化的磁盘。对于这类磁盘,
FreeSpace
Size
都是空的,因此只有一个令牌
Name

注意事项:

我对
sqlcmd
命令行肯定不确定,实际上我只是在猜测。

您可以将正在使用的两个
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
。对于/F
跳过第一行,因为它是标题。然后只提取前两个字段
FreeSpace
Name
,但不提取
Size
;这是刚刚添加的,因此所需字段
Name
不是最后一个字段,因为
wmic
生成Unicode输出,并且
for/F
正确转换为ANSI,但不是最后一个字段

如果不是“%%K”==”
查询旨在筛选出未格式化的磁盘。对于这类磁盘,
FreeSpace
Size
都是空的,因此只有一个令牌
Name

注意事项:
我肯定不能确定
sqlcmd
命令行,实际上我只是在猜测。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
对于/f“tokens=1*delims==”%%a IN(
'wmic LOGICALDISK获取自由空间^,名称/格式:列表'
)做(
如果/i“%%a”==“自由空间”设置“自由=%%b”
如果/i“%%a”==“名称”(
设置“名称=%%b”
ECHO sqlcmd-v varSpace=“!free:~0,-1!”column=“FIELD1”-v varSpace=“!name:~0,2!”column=“FIELD2”-ic:\cmdutils\test.sql
)
)
后藤:EOF
这对我有效,但我不确定
sqlcmd
语法(
sqlcmd
只是
echo
ed)

@echo OFF
SETLOCAL ENABLEDELAYEDEXPANSION
对于/f“tokens=1*delims==”%%a IN(
'wmic LOGICALDISK获取自由空间^,名称/格式:列表'
)做(
如果/i“%%a”==“自由空间”设置“自由=%%b”
如果/i“%%a”==“名称”(
设置“名称=%%b”
ECHO sqlcmd-v varSpace=“!free:~0,-1!”column=“FIELD1”-v varSpace=“!name:~0,2!”column=“FIELD2”-ic:\cmdutils\test.sql
)
)
后藤:EOF
这对我很有效,但我不确定
sqlcmd
语法(
sqlcmd
只是
echo
ed)