iT邦幫忙

0

Powershell Class 疑問

  • 分享至 

  • xImage
 $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
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
re.Zero
iT邦研究生 5 級 ‧ 2022-12-03 04:01:14
最佳解答

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
## 
0
雷峰
iT邦研究生 1 級 ‧ 2022-11-29 11:20:14

試試參考微軟官方描述class
ADODB.Connection為什麼要放進class裡面@@?
另外,您要使用class做什麼功用?

亂皮皮 iT邦新手 2 級 ‧ 2022-11-29 12:15:50 檢舉

我其實想要做一個查詢AD上面USER資訊放在一個CLASS變數上面,之後再呼叫使用

Ex:
ADUser.department
ADUser.Company

我要發表回答

立即登入回答