Batch - For循环 - 将循环中的两个变量设置为sqlcmd

时间:2015-12-28 23:06:21

标签: batch-file for-loop sqlcmd

我有这个批次获得可用空间关于我的系统所拥有的设备及其名称(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行,空格和名称。

我如何加入这两个循环?

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个字段FreeSpaceNameSize。第一行被for /F跳过,因为它是标题。然后,只提取了前两个字段FreeSpaceName,但Size不是;刚刚添加了这个,以便所需的字段Name不是最后一个,因为wmic生成Unicode输出,for /F正确转换为ANSI但不是最后一个字段。< / p>

if not "%%K"==""查询旨在过滤掉未格式化的磁盘。对于此类磁盘,FreeSpaceSize都为空,因此只有一个令牌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编辑)