2015-12-28 3 views
0

У меня есть эта партия, что получить свободное пространство об устройствах, что моя система имеет и имя они (C:\, D:\, и т.д.).Batch - Для цикла - Набор двух переменных в цикле для Sqlcmd

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 строки с пробелом и именем.

Как я могу присоединиться к двум петлям?

ответ

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, потому что это заголовок. Затем извлекаются только первые 2 поля FreeSpace и Name, но Size - нет; это только что добавлено, так что необходимое поле Name не является последним, потому что wmic производит выход Unicode, а for /F делает правильное преобразование в ANSI, но не для последнего поля.

Запрос if not "%%K"=="" предназначен для фильтрации дисков, которые не отформатированы. Для таких дисков оба FreeSpace и Size пустые, поэтому есть только один токен Name.

Внимание:
Я определенно не уверен в sqlcmd командной строке, на самом деле я просто угадать.

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
@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 редактор)

Смежные вопросы