我正在創建一些用于活動目錄管理的工具,并且在通過 powershell 搜索 AD 時遇到了 IP 地址未轉換為主機名的問題。作為一種解決方法,我創建了這個 Resolve-Hostname 函式,如果我自己運行它,它就可以正常作業。只要我把它放在我的整體腳本中并嘗試呼叫它,它就不會將 IP 轉換為主機名......
下面是我創建的功能
function Resolve-Hostname {
If ($Workstation -like "*.*.*.*") #Convert IP Address to Hostname
{
$NameHost = resolve-dnsname $Workstation | Select-Object -ExpandProperty NameHost -First 1
$Workstation = ($NameHost -Split {$_ -eq "."})[0]
}
} #close of create the Resolve-Hostname function
任何知道如何更好地實作這一點的人也可以隨意加入,我絕不是專家。
我不確定我的問題出在哪里,所以我將從頭開始,任何優化我的腳本的建議將不勝感激。
設定視窗大小
$pshost = get-host
$pswindow = $pshost.ui.rawui
$newsize = $pswindow.windowsize
$newsize.height= 30
$newsize.width = 60
$pswindow.windowsize = $newsize
宣告 Show-Menu 和 resolve-host 函式
#Create functions
function Show-Menu { #Create the Show-Menu function
param ([string]$Title = 'Admin Tools Menu') #Sets title
Clear-Host
Write-Host " "
Write-Host " "
Write-Host "`t$Title" -foregroundcolor Blue #Display title of menu
Write-Host "`t1: Add Admin."
Write-Host "`t2: Boot Time."
Write-Host "`t3: User 'Shr_' Groups."
Write-Host "`t4: Computer Management."
Write-Host "`t5: Active Directory."
Write-Host "`t6: Remove Admin."
Write-Host "`t7: Disable Workstation in AD"
Write-Host
Write-Host "`tQ: Enter 'Q' to quit."
Write-Host
Write-Host
} #close of create show menu function
function Resolve-Hostname {
If ($Workstation -like "*.*.*.*") #Convert IP Address to Hostname
{
$NameHost = resolve-dnsname $Workstation | Select-Object -ExpandProperty NameHost -First 1
$Workstation = ($NameHost -Split {$_ -eq "."})[0]
}
} #close of create the Resolve-Hostname function
#End of create functions
下面腳本的實作
#Begin Main Menu
do
{
Show-Menu #Displays created menu above
$Selection = $(Write-Host "`tMake your selection: " -foregroundcolor Red -nonewline; Read-Host)
switch ($selection)
{
'1' { #Add Admin
Clear-Host
$Workstation = $(Write-Host "Workstation\IP Address" -nonewline -foregroundcolor DarkGreen) $(Write-Host "?: " -NoNewline; Read-Host) #Declare Workstation/IP Address
Resolve-Hostname
$Workstation
pause
暫停后,腳本將作業站添加到管理員組,但我相當確定該部分與手頭的問題無關。沒有彈出錯誤,只是 $workstation 輸出 IP 地址,而不是根據 resolve-hostname 函式決議為主機名。
uj5u.com熱心網友回復:
您不能從從該范圍呼叫的函式內部直接修改位于腳本 范圍內的變數,因為它在子范圍內運行。
- 雖然子作用域可以讀取父作用域的變數(及其父作用域的變數,等等),但僅按名稱寫入它們- 也許令人驚訝 - 會創建一個同名的函式區域變數- 請參閱此答案以獲取更多資訊和腳注[1] 下面進行演示。
雖然使用
$script:范圍修飾符 -$script:Workstation在您的情況下 -會起作用,但[1] 或更一般地說,為了封裝的利益,最好避免跨范圍邊界訪問變數。Set-Variable-Scope 1 WorkStation ...- 相反,讓您的函式輸出(回傳)修改后的值,并讓呼叫者(重新)將輸出分配給其范圍內的變數。
- 同樣,函式最好通過宣告的引數接收輸入值作為引數。
- 這兩種技術如下所示。
如下重新定義您的函式,使其 (a) 通過引數接受要決議的值,并 (b)輸出(可能)決議的值:
function Resolve-Hostname {
param(
[string] $Workstation # Declare a parameter.
)
# Note that $Workstation now refers to the (always local) *parameter* variable.
If ($Workstation -like "*.*.*.*") { #Convert IP Address to Hostname
$NameHost = Resolve-DnsName $Workstation | Select-Object -ExpandProperty NameHost -First 1
# Extract the first "."-based component *and output it*.
($NameHost -split '\.')[0]
} else {
$Workstation # Already a hostname, output it as-is.
}
}
然后,您將按如下方式呼叫您的函式:
# Sample value.
$workstation = '142.251.40.238'
# Call the function with the sample value, and capture the
# output in the same local variable.
$workstation = Resolve-HostName $workstation
[1] 原始問題和$script:解決方法的快速演示,使用腳本塊 ( { ... }) 代替函式,使用呼叫運算符
呼叫,它在子作用域中&運行塊區域變數,因此父作用域中的原始變數保持不變。
相比之下,由于明確針對腳本(父)范圍的變數,因此輸出。$i = 42; & { $i = $i 1 }; $i42$i = ... $i$i$i = 42; & { $script:i = $i 1 }; $i43$script:i = ...$i
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531500.html
標籤:视窗电源外壳活动目录
