2012. július 12., csütörtök

VBA / VBS használat



Megjegyzés:
' Ez egy megjegyzés






MINTA:
' --------------- SQL ripport  ---------------
'********************************************************************
'*
'* Copyright Kecskeméti Lajos
'*
'* Module Name:    sql_xls.vbs 
'*
'* SQL eredmény XLS-be töltése
'*
'*
'********************************************************************

' alap beállítások
Option Explicit

ON ERROR RESUME NEXT
Err.Clear

' valtozók
Dim objRootDSE, strDNSDomain, adoConnection
Dim strBase, strFilter, strAttributes, strQuery, adoRecordset
Dim strName, strDN, objManagerList, strManagerDN
Dim objExcel, objWorkbook, objWorkSheet, x, y, celx,cely, eField, objRange, objRange2
Dim strExcelPath
Dim strCon

Const xlAscending = 1
Const xlDescending = 2
Const xlYes = 1

wscript.echo date 
wscript.echo now 

'--------- Oracle konnekció
strCon = "Driver={Microsoft ODBC for Oracle}; " & _
         "CONNECTSTRING=(DESCRIPTION=" & _
         "(ADDRESS=(PROTOCOL=TCP)" & _
         "(HOST=szerver)(PORT=1521))" & _
         "(CONNECT_DATA=(SID = DB))); uid=nev;pwd=jelszo;"

Dim oCon: Set oCon = WScript.CreateObject("ADODB.Connection")
Dim oRs: Set oRs = WScript.CreateObject("ADODB.Recordset")
oCon.Open strCon

'Set oRs = oCon.Execute(" SELECT sysdate FROM DUAL union SELECT to_char(sysdate,'YYYYMMDD') FROM DUAL ")
Set oRs = oCon.Execute(" select * from kz_heti_teny  where 1=1 and period ='20110129' ")

strExcelPath = "d:\tmp\seredmeny_01.xlsx"

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = FALSE
objExcel.ScreenUpdating = FALSE
objExcel.DisplayAlerts = FALSE 
Set objWorkbook = objExcel.Workbooks.Add

wscript.echo time 

'objExcel.Visible = True

'Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)
wscript.echo now & "elso 1" 

celx = 1
cely = 0
x = 1
y = 1

'While Not oRs.EOF  
do until oRs.EOF
    for each eField in oRs.Fields
 If x = 1 Then
 ' fejléc
  objExcel.Cells((celx + x - 1), (cely + y )).Value = eField.name
  objExcel.Cells((celx + x), (cely + y)).Value = eField.value
 else
  objExcel.Cells((celx + x), (cely + y)).Value = eField.value
 End If  
  y = y + 1
'   WSCript.Echo "Valami-1"
'   WSCript.Echo celx
'      WSCript.Echo eField.value
next
y = 1
    x = x + 1
    oRs.MoveNext
'Wend
'WSCript.Echo x
loop

set objWorksheet = objWorkbook.Worksheets(2).Activate
Dim valodi_ketdtomb() 'dynamic array
ReDim valodi_ketdtomb(x-1,oRs.Fields.Count) 'redim 4 rows, 3 cols

oRs.MoveFirst
x = 0
y = 0
do until oRs.EOF
    for each eField in oRs.Fields
 If x = 0 Then
  valodi_ketdtomb(x, y) = eField.value
 else
  valodi_ketdtomb(x, y) = eField.value
 End If  
  y = y + 1
'   WSCript.Echo "Valami-1"
'   WSCript.Echo celx
'      WSCript.Echo eField.value
next
y = 0
    x = x + 1
    oRs.MoveNext
'Wend
'WSCript.Echo x
loop

'valodi_ketdtomb=array(null,1,2,3, 4,0,11,22,33,44,0,111,222,333,444,null)

Dim valodi_ketdtomb_regi() 'dynamic array
ReDim valodi_ketdtomb_regi(4,3) 'redim 4 rows, 3 cols
valodi_ketdtomb_regi(0,0) = 1
valodi_ketdtomb_regi(0,1) = 2
valodi_ketdtomb_regi(0,2) = 3
valodi_ketdtomb_regi(1,0) = 10
valodi_ketdtomb_regi(1,1) = 200
valodi_ketdtomb_regi(1,2) = 300

objExcel.Range("E1").Value = oRs.Fields.Count
objExcel.Range("E2").Value = x 'oRs.Records.Count

'Populate by column and row

objExcel.Range("A1:D20").Value = 5
'objExcel.Range("F1:T100").Value= valodi_ketdtomb
objExcel.Range( objExcel.Cells(2,6), objExcel.Cells(x+2,6+oRs.Fields.Count) ).Value = valodi_ketdtomb

objExcel.Range( objExcel.Cells(3,5), objExcel.Cells(5,5) ).Value = "E3-R1C5"
'Range(Cells(3,5),Cells(5,5)).Select

wscript.echo now & "masodik 2" 

' XLS  megjelenítés
 'objExcel.Visible = True
wscript.echo now 

' Save the spreadsheet.
'objExcel.ActiveWorkbook.Save
objExcel.ActiveWorkbook.SaveAs strExcelPath
objExcel.ActiveWorkbook.Close

' Quit Excel
objExcel.Application.Quit

wscript.echo now 

' Clean up.
adoRecordset.Close
adoConnection.Close 

oCon.Close
Set oRs = Nothing
Set oCon = Nothing

wscript.echo now 

' --------------- LDAP ---------------

'********************************************************************
'*
'* Copyright Kecskeméti Lajos
'*
'* Module Name:    sql_xls.vbs 
'*
'* SQL eredmény XLS-be töltése
'*
'*
'*


'********************************************************************
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("DefaultNamingContext")
strBase = "<LDAP://" & strDNSDomain & ">"

strFilter = "(&(objectClass=user))"
strAttributes = "sAMAccountName, distinguishedName"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 10000
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute


adoRecordset.MoveFirst

strResults = "User Login Names" 

Do Until adoRecordset.EOF 
'Retrieve values and display
strName = adoRecordset.Fields("sAMAccountName").Value 
strDN = adoRecordset.Fields("distinguishedName").Value
strResults = strResults & VbCrLf & strName & " | " & strDN
adoRecordset.MoveNext
Loop

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("eredmeny.txt", True)
objFile.Write strResults
objFile.Close
Set objFile = Nothing
MsgBox "Elkészültem nézz bele a 'eredmeny.txt' -be."



Használata
cscript sql_xls.vbs 
wscript sql_xls.vbs 

PowerShell alapok 1

A PowerShellt a Microsoft eleinte a hagyományos CMD / DOS-prompt, a parancssor utódjaként tervezte, de aztán egyre inkább egy univerzális rendszerkezelő, feladatautomatizáló platformként lett definiálva.

A PowerShell tehát egyszerre nagyon sok minden: parancssori eszköz, amellyel begépelt parancsokkal tudjuk utasítani a számítógépünket, hogy különböző műveleteket elvégezzen. A PowerShell egy programnyelv is, minden ehhez szükséges jellemzővel: ciklussal, vezérlőutasításokkal, operátorokkal, változókkal, adattípusokkal.

PowerShell :

az  Windows parancssori rendszerhéj, mely különösen a rendszergazdák (üzemeltetésre) számára terveztek. 


Windows PowerShell tartalmaz egy interaktív kérdés és a egy parancsfájl-kezelési környezet, amely önállóan vagy együtt is használhatók.


Legtöbb rendszerhéjjal ellentétben, a komunikáció  szöveg, de a windows PowerShell a .NET-keretrendszer közös nyelvi futtatókörnyezet (CLR) és a .NET-keretrendszer épül, és objektumokkal kommunikál.


 Ez a alapvető változtatás a környezet kezelése és a Windows configuration teljesen új eszközöket és módszereket biztosít.


 Windows PowerShell több mint száz alapszintű fő parancsmagot tartalmaz, és mindenki írhat írhat saját parancsmagokat is, melyeket akár más felhasználókkal való megosztással is használhat..



A környezetválasztóval, például a Windows PowerShell hozzáférést biztosít a fájlrendszerhez regisztry-hez, szolgáltatók más adattárakban, a beállításjegyzék és a digitális aláírás tanúsítványtárolókban lévő adatokhoz is.



Használata:

   - Fejelsztésre a  Powershell ISE alkalmazáson interaktív módban a legkényelmesebb
   - Futtatáshoz az elkészült és állományba mentett szkript (  .ps1 file) futtatása elég


Szintaktika

Megjegyzés jelölése :
##  íéáűúőóüö_ÍÉÁŰÚŐÓÜÖ 

Más ps elő betöltése:
. d:\prg\Reporting\Modules\kl.ps1 

Környezet munkaterület beállítása:
d:
cd \prg\kl\riport




Értékek file-ből betöltése és feldolgozása (soronként tömb elemibe):

$kltam = Get-Content "d:\prg\tam.txt"

$count =0
$kltam | ForEach-Object{


## beolvasás fileből és minta csere tömb elemeivel:

$sql = Load-File ("d:\prg\riport\kl.sql")
$r=[regex]':csere:';
$sql = $r.Replace($sql, $kltam[$count], -1);


...


   $count++
}


Minta : LDAP (maszkolt) felhasználók lista lekérdezés és excel-be írás:


$SAMName = "kecskemetil*"
$excel = New-Object -COM Excel.Application
$ci = [System.Globalization.CultureInfo]'en-US'
$src="d:\prg\ldap.xls"
if ( [System.IO.File]::Exists($src) )
{
  remove-item -force $src
}
$book = $excel.Workbooks.PSBase.GetType().InvokeMember('Add', [Reflection.BindingFlags]::InvokeMethod, $null,$excel.Workbooks, $null, $ci)
$excel.Visible = 0
$sheet = 1
$sh = $book.sheets.item($sheet)

$sh.Cells.item(1,1).formulaLocal = "CN"
$sh.Cells.item(1,2).formulaLocal = "sAMAccountName"
$sh.Cells.item(1,3).formulaLocal = "title"
$sh.Cells.item(1,4).formulaLocal = "distinguishedname"
$sh.Cells.item(1,5).formulaLocal = "manager"
$sh.Cells.item(1,6).formulaLocal = "displayName"
$sh.Cells.item(1,7).formulaLocal = "physicalDeliveryOfficeName"
$sh.Cells.item(1,8).formulaLocal = "mail'"
$sh.Cells.item(1,9).formulaLocal = "department"
$sh.Cells.item(1,10).formulaLocal = "mobile"
$sh.Cells.item(1,11).formulaLocal = "memberOf"
$sh.Cells.item(1,12).formulaLocal = "initials"

$i = 2

ldap_fnev & "));cn, samaccountname, title, distinguishedname, employeeid, physicalDeliveryOfficeName, manager, displayName, department, mail, mobile, mailNickname, manager, description, extensionAttribute2;subtree"
$root = [ADSI]"LDAP://DC= netudki,DC=corp"
$search = [adsisearcher]$root
$Search.filter = "(&(objectClass=user)(sAMAccountName= $SAMName))"
$colResults = $Search.FindAll()

$ii=2
foreach ($i in $colResults)
{
$sh.Cells.item($ii,1).formulaLocal = [string]$i.Properties.Item('cn')
$sh.Cells.item($ii,2).formulaLocal = [string]$i.Properties.Item('sAMAccountName')
$sh.Cells.item($ii,3).formulaLocal = [string]$i.Properties.Item('title')
$sh.Cells.item($ii,4).formulaLocal = [string]$i.Properties.Item('distinguishedname')
$sh.Cells.item($ii,5).formulaLocal = [string]$i.Properties.Item('manager')
$sh.Cells.item($ii,6).formulaLocal = [string]$i.Properties.Item('displayName')
$sh.Cells.item($ii,7).formulaLocal = [string]$i.Properties.Item('physicalDeliveryOfficeName')
$sh.Cells.item($ii,8).formulaLocal = [string]$i.Properties.Item('mail')
$sh.Cells.item($ii,9).formulaLocal = [string]$i.Properties.Item('department')
$sh.Cells.item($ii,10).formulaLocal = [string]$i.Properties.Item('mobile')
$sh.Cells.item($ii,11).formulaLocal = [string]$i.Properties.Item('memberOf')
$sh.Cells.item($ii,12).formulaLocal = [string]$i.Properties.Item('initials')
$ii++
}

#excel elmentése $src helyre és néven "56" formátumban - excel formátum, majd futo excel folyamat bezárása
[void]$book.PSBase.GetType().InvokeMember('SaveAs', [Reflection.BindingFlags]::InvokeMethod, $null, $book, ($src,"56"), $ci)
$excel.quit() 
#  if (ps excel) { kill -name excel}  ### ha fut mindenképpen lezárás
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)




PS használat:
cmd/bat fileből: 
powershell -noexit &"c:\Könyvtár szóközzel\második.ps1"
powershell -noexit c:\második.ps1


Buktatók:
 - a társítás ps1 notepad.exe ezért futtatásnál nem fút
 - teljes elérési útvonal megadása szükséges
 - jogosultság beállítása (csak admin)
## jog beállítása
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
PS C:\> Set-ExecutionPolicy -ExecutionPolicy Bypass
## jog lekérdezése
PS C:\> Get-ExecutionPolicy -List