批处理 - 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
)
)
有FreeSpace
、Name
、Size
这3个字段以table格式返回。第一行被 for /F
跳过,因为它是 header。然后只提取前 2 个字段 FreeSpace
和 Name
但 Size
不是;这是刚刚添加的,因此所需的字段 Name
不是最后一个,因为 wmic
生成 Unicode 输出,并且 for /F
正确转换为 ANSI 但不是最后一个字段。
if not "%%K"==""
查询旨在过滤掉未格式化的磁盘。对于这样的磁盘,FreeSpace
和Size
都是空的,所以只有一个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
只是 echo
ed)
我有这批 免费 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
)
)
有FreeSpace
、Name
、Size
这3个字段以table格式返回。第一行被 for /F
跳过,因为它是 header。然后只提取前 2 个字段 FreeSpace
和 Name
但 Size
不是;这是刚刚添加的,因此所需的字段 Name
不是最后一个,因为 wmic
生成 Unicode 输出,并且 for /F
正确转换为 ANSI 但不是最后一个字段。
if not "%%K"==""
查询旨在过滤掉未格式化的磁盘。对于这样的磁盘,FreeSpace
和Size
都是空的,所以只有一个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
只是 echo
ed)