批处理 - For 循环 - 将循环中的两个变量设置为 sqlcmd

Batch - For loop - Set two variables in loop to sqlcmd

我有这批 免费 space 关于我的系统拥有的设备及其名称(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)')

问题是 第一个 for 循环插入 3 行(我有 3 个磁盘),free space第二个循环使用名称再插入 3 行总共 6 行

正确的操作共3行space和名称

如何加入两个循环?

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

另一种方法是使用 Find "Bytes " 中的 DIR 命令获取 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]
  )
)

您可以组合使用的两个 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
    )
)

FreeSpaceNameSize这3个字段以table格式返回。第一行被 for /F 跳过,因为它是 header。然后只提取前 2 个字段 FreeSpaceNameSize 不是;这是刚刚添加的,因此所需的字段 Name 不是最后一个,因为 wmic 生成 Unicode 输出,并且 for /F 正确转换为 ANSI 但不是最后一个字段。

if not "%%K"=="" 查询旨在过滤掉未格式化的磁盘。对于这样的磁盘,FreeSpaceSize都是空的,所以只有一个tokenName.

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

@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 只是 echoed)