我一直在使用 cmd/batch 檔案根據計算機所在的 IP 范圍創建 locationid 變數。我需要使用 powershell 執行類似的功能。任何建議都會受到歡迎。
作為我在批處理檔案中使用的代碼示例:
For /F "Delims==" %%G In ('Set octet 2^>NUL')Do Set "%%G="
For /F "Tokens=2 Delims=:" %%G In (
'"%__AppDir__%ipconfig.exe 2>NUL|%__Appdir__%find.exe "IPv4""'
)Do For /F "Tokens=1-4Delims=. " %%H In ("%%G"
)Do Set "octet1=%%H"&Set "octet2=%%I"&Set "octet3=%%J"&Set "octet4=%%K"
Set octet>NUL 2>&1||(Echo IPConfig failed to retrieve an IP address.
Pause&GoTo :EOF)
Set "BuildingLOC="
If %octet1% Equ 10 If Defined octet2 (
If %octet2% GEq 6 If %octet2% LEq 7 Set "BuildingLOC=VM"
If %octet2% GEq 10 If %octet2% LEq 19 Set "BuildingLOC=ADM"
)
uj5u.com熱心網友回復:
使用 IP 八位位元組:
function Get-HostIP {
[CmdletBinding()]
[OutputType([string])]
param ()
# https://stackoverflow.com/a/44685122/4190564
$Return = (
Get-NetIPConfiguration | Where-Object {
$null -ne $_.IPv4DefaultGateway -and $_.NetAdapter.Status -ne "Disconnected"
}
).IPv4Address.IPAddress
return $Return
}
Function Get-IPOctets {
[CmdletBinding()]
[OutputType([int[]])]
param (
[Parameter(Mandatory = $true, Position = 0)]
[string]$IPAddress
)
if( $IPAddress -match '(?<Octet1>\d )\.(?<Octet2>\d )\.(?<Octet3>\d )\.(?<Octet4>\d )') {
return $Matches.Octet1, $Matches.Octet2, $Matches.Octet3, $Matches.Octet4
} else {
return 0, 0, 0, 0
}
}
$Octet1, $Octet2, $Octet3, $Octet4 = Get-IPOctets (Get-HostIP)
if($Octet1 -eq 10) {
switch ($Octet2) {
{$_ -in 6..7} {$BuildingLOC = 'VM'; break}
{$_ -in 10..19} {$BuildingLOC = 'ADM'; break}
default {$BuildingLOC = 'Other'; break}
}
} else {
$BuildingLOC = 'Invalid'
}
Write-Host "IPType: $BuildingLOC"
使用計算機名稱的前 3 個字母:
if($HostName = [System.Net.Dns]::GetHostName()) {
if($HostName.Substring(0, 3) -eq 'ABC') {
Write-Host "Computer name matches"
} else {
Write-Host "Computer name does not match "
}
} else {
Write-Host "No computer name"
}
編輯:
最初錯過了評論中關于 setx /m 的問題,所以這里有幾個與環境變數相關的選項。
設定環境變數/獲取環境變數:
看看這個答案中的例子。請注意,“路徑”是示例中的變數名稱,但可以使用您想要的任何名稱。對于 SetEnvironmentVariable,$Value 是要保存的值。還要注意,在 GetEnvironmentVariable 示例中有 3 個地方,Process/Machine/User,這是存盤或檢索變數的地方。我喜歡這些示例,因為給出了對目標位置的完整參考,但如果您查看此問題中的示例,您會發現它可以縮寫為“Process”、“Machine”和“User”。
- 程序:我相信這只是臨時存盤,與使用 $Env:MyVar 相同。GetEnvironmentVariable 可以讀取當前會話記憶體中的任何內容,但是一旦當前 PowerShell 會話關閉,由 SetEnvironmentVariable 設定的任何內容都將丟失。
- 機器:這些變數將可供所有用戶使用,并且即使在重新啟動后仍然可用。但可能無法通過當前腳本會話中的 $Env:MyVar 獲得。
- 用戶:僅對當前用戶可用,即使在重新啟動后仍然可用。但可能無法通過當前腳本會話中的 $Env:MyVar 獲得。
設定x.exe:
任何可執行檔案都可以從 PowerShell 運行,但有幾點需要注意。如果您查看我幾天前給出的這個答案,您會看到:
- 您可以從 ss64.com 下載 EchoArgs,執行 EchoArgs 而不是您的 exe 檔案,在本例中為 setx,記錄傳遞給 EchoArgs 的引數的模式,然后在 PowerShell 中構建一個輸出完全相同的引數模式的 EchoArgs 行,最后替換在 PowerShell EchoArgs 中使用您的 exe 檔案,在本例中為 setx。
- 在問題的后面,我介紹了 --% 引數/運算子的使用,它導致 PowerShell 停止處理該行并按原樣傳遞它。
- 然后我解釋了如何使用環境變數來動態替換 --% 引數/運算子之后的部分行。
可以在此處找到更短但相似的答案。但是,如果您在同一問題中查看Lance 的答案,您可以看到他使用Start-Process -FilePath $RunPath -ArgumentList $MyArgsText啟動 exe 檔案并將引數傳遞給它。我還沒有花時間嘗試 Start-Process,但它看起來是一個有趣的選擇。
正則運算式:
您可以使用的另一個 exe 檔案是 REG.EXE。如果您查看此頁面,您會看到描述的機器、行程和用戶,其中包括存盤環境變數的注冊表項。實際上,我很久以前就停止在批處理檔案中使用 setx 了,因為我遇到了 setx 無法存盤的值,但 REG.EXE 沒有問題。
以下是我在一些批處理檔案中找到的一些示例:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /V "EnableUAC" /T "REG_SZ" /D "Yes" /F>NUL 2>&1
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /V "%%A" /T REG_EXPAND_SZ /D "%~2" /F
REG DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /V "TemporaryMachineName" /F>NUL 2>&1
還有一個來自 PowerShell 腳本:
REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /V "PSModuleTest" 2>$null
PowerShell 注冊表:
我不打算通過 PowerShell 編輯注冊表,但請注意 Get-ItemPropertyValue/Set-ItemPropertyValue、Get-ItemProperty/Set-ItemProperty、Get-ChildItem/Set-ChildItem 和 Get-Item/Set- Item 是用于執行此操作的常用內置 PowerShell 命令。
要獲得更多控制權和更多努力,您可以使用以下命令系列:[RegistryKey]::OpenRemoteBaseKey, [RegistryKey]::OpenBaseKey, $BaseKey.OpenSubKey, $SubKey.SetValue, $SubKey.GetValue, $ SubKey.DeleteValue 等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460305.html
