2015-12-28 1 views
0

J'ai ce lot qui obtiennent l'espace libre sur les appareils que mon système a et le nom de leur (C:\, D:\, etc) - Pour la boucle.Lot - Définir deux variables dans la boucle à 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) 

Le fichier SQL fait un insert:

USE [BBDD_SYSTEM] 
INSERT INTO SYS_TABLE ($(column)) VALUES ('$(varSpace)') 

Le problème est le première pour l'insertion de la boucle 3 rangées (I ai 3 disques) avec le espace libre et le deuxième boucle insérer 3 lignes plus avec le nom, total 6 lignes

Le opération correcte est de 3 lignes au total avec l'espace et le nom.

Comment joindre les deux boucles?

Répondre

1

Vous pouvez combiner les deux lignes de commande wmic que vous utilisez, comme ceci:

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

Les champs FreeSpace, Name, Size sont renvoyés sous forme de tableau. La première ligne est ignorée par for /F, car il s'agit de l'en-tête. Alors seulement les 2 premiers champs FreeSpace et Name sont extraits mais Size ne l'est pas; ceci vient d'être ajouté pour que le champ requis Name ne soit pas le dernier, car wmic produit une sortie Unicode, et for /F effectue une conversion correcte en ANSI mais pas pour le dernier champ.

La requête if not "%%K"=="" est destinée à filtrer les disques qui ne sont pas formatés. Pour ces disques, FreeSpace et Size sont vides, il n'y a donc qu'un seul jeton Name.

Attention:
Je suis certainement pas sûr de la ligne de commande sqlcmd, en fait je suis juste deviner.

1

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

Une autre façon est d'utiliser la commande DIR redirigée Find "Bytes " pour obtenir les 2 variables:

@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 

Cela a fonctionné pour moi, mais je ne suis pas sûr de la syntaxe sqlcmd (le sqlcmd est tout simplement echo ed)