$objConnection = New-Object -comObject ADODB.Connection
$objCommand = New-Object -comObject ADODB.Command
$objConnection.Open("Provider=ADsDSOObject;")
$objCommand.ActiveConnection = $objConnection
$strQuery = "<LDAP://DC=abc,DC=com>;(objectClass=user);adspath,department,title,Company;subtree"
$objCommand.CommandText = $strQuery
$objCommand.Properties("Page Size") = 1000
$objCommand.Properties("Timeout") = 0
$objCommand.Properties("Cache Results") = $false
$objRecordSet = $objCommand.Execute()
if($objRecordSet -ne $null){
$Department = $objRecordSet.Fields.item("department").Value
$Title = $objRecordSet.Fields.item("Title").Value
$Company = $objRecordSet.Fields.item("Company").Value
}
各位大大好
最近在研究Powershell,這一段程式直接執行是可以正常運作,但是我想要把它用Class包起來,就會出現錯誤訊息,不太明白這個錯誤訊息是什麼意思
位於 線路:10 字元:19
+ $objConnection = New-Object -comObject ADODB.Connection
+ ~
屬性定義中遺漏 ';' 或行結尾。
位於 線路:10 字元:25
+ $objConnection = New-Object -comObject ADODB.Connection
+ ~
類別方法參數清單中遺漏 '('。
位於 線路:10 字元:25
+ $objConnection = New-Object -comObject ADODB.Connection
+ ~
function 宣告中遺失函數主體。
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingPropertyTerminator
Update: 用兩個類別作不同範例(沒差多少就是了~)
## Tested on PowerShell-v7.2.7;
##
class myClass01 {
## 這個 「類別宣告」(class declaration) 就只是把你的程式都丟到類別的 "justRun" 這「方法」(method) 內執行。
## 如有要供外部存取的變數或其他需求,請自行規劃、修改此類別宣告;
[void] justRun () {
$objConnection = New-Object -comObject ADODB.Connection
$objCommand = New-Object -comObject ADODB.Command
$objConnection.Open("Provider=ADsDSOObject;")
$objCommand.ActiveConnection = $objConnection
$strQuery = "<LDAP://DC=abc,DC=com>;(objectClass=user);adspath,department,title,Company;subtree"
$objCommand.CommandText = $strQuery
$objCommand.Properties("Page Size") = 1000
$objCommand.Properties("Timeout") = 0
$objCommand.Properties("Cache Results") = $false
$objRecordSet = $objCommand.Execute() ## 我的測試只能跑到這(畢竟我的測試不是在你的環境);
if($objRecordSet -ne $null){
$Department = $objRecordSet.Fields.item("department").Value
$Title = $objRecordSet.Fields.item("Title").Value
$Company = $objRecordSet.Fields.item("Company").Value
}
}
}
##
class myClass02 {
## 這個類別宣告是把 "New-Object" 的命令放在建構函式內,
## 以便往後能存取 "myClass02" 的實例之 "$objConnection"、"$objCommand"。
[System.__ComObject] $objConnection
[System.__ComObject] $objCommand
myClass02(){ ## 建構函式
## 為何要使用「建構函式」,請參考「類別(class) 與 實例(instance)」的關聯概念。
$this.objConnection = New-Object -comObject ADODB.Connection
$this.objCommand = New-Object -comObject ADODB.Command
}
[void] justRun () {
## 後續請自依需求,看是要丟外部執行、建立可供外部存取的屬性、或設計存取方式等自行修改。
$this.objConnection.Open("Provider=ADsDSOObject;")
$this.objCommand.ActiveConnection = $this.objConnection
$strQuery = "<LDAP://DC=abc,DC=com>;(objectClass=user);adspath,department,title,Company;subtree"
$this.objCommand.CommandText = $strQuery
$this.objCommand.Properties("Page Size") = 1000
$this.objCommand.Properties("Timeout") = 0
$this.objCommand.Properties("Cache Results") = $false
$objRecordSet = $this.objCommand.Execute() ## 我的測試只能跑到這;
if($objRecordSet -ne $null){
$Department = $objRecordSet.Fields.item("department").Value
$Title = $objRecordSet.Fields.item("Title").Value
$Company = $objRecordSet.Fields.item("Company").Value
}
}
}
##
function myMain {
## 呼叫函式執行主要流程只是我的習慣,你可以自己改~
## myClass01
Write-Host "myClass01:"
$myObj01 = [myClass01]::new()
try { $myObj01.justRun() }
catch { $_ }
## myClass02
Write-Host "myClass02:"
$myObj02 = [myClass02]::new()
try { $myObj02.justRun() }
catch { $_ }
finally { $myObj02.objConnection.Close() }
}
##
myMain
##
試試參考微軟官方描述class
ADODB.Connection為什麼要放進class裡面@@?
另外,您要使用class做什麼功用?