powershell - 使用 PS 合并计算机类型和资产标签
问题描述
我编写了一个 PowerShell 脚本来重命名我的计算机,将其添加到特定的 OU 并将其加入域。我的问题是我们有两种类型的计算机台式机(DT)和笔记本电脑(LT),我们给它一个资产标签,我想让它让我选择它是台式机还是笔记本电脑,然后询问资产标签编号,然后在资产标签编号前添加 DT 或 LT 作为计算机名称(如有混淆,请见谅),例如:DT01234 或 LT01235。我将在下面发布我的代码,并将重命名计算机的区域加粗。任何和所有的帮助将不胜感激。
Write-Host "Select Desktop or Laptop [1-2] [Default 1]:
1. Desktop
2. Laptop"
$computertype = Read-Host
Write-Host "Please Enter Asset Tag"
$NewCompName = Read-Host
$renamecomputer = $true
if ($NewCompName -eq "" -or $NewCompName -eq $env:COMPUTERNAME) {$NewCompName = $env:COMPUTERNAME; $renamecomputer = $false}
Write-Host "Please enter your desired location [1-7] [Default 1]:
1. Test
2. Compliance Stations
3. Controls Stations
4. Processing Stations
5. QC Stations
6. Receiving Stations
7. Shipping Stations"
$ou = Read-Host
#$creds = Get-Credential
function Test-ADCrential{
[CmdletBinding()]
param(
[pscredential]$Credential
)
try {
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
if(!$Credential) {
$Credential = Get-Credential -EA Stop
}
if($Credential.username.split("\").count -ne 2) {
throw "You haven't entered credentials in DOMAIN\USERNAME format. Given value : $($Credential.Username)"
}
$DomainName = $Credential.username.Split("\")[0]
$UserName = $Credential.username.Split("\")[1]
$Password = $Credential.GetNetworkCredential().Password
$PC = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, $DomainName)
if($PC.ValidateCredentials($UserName,$Password)) {
Write-Verbose "Credential validation successful for $($Credential.Username)"
return $True
} else {
throw "Credential validation failed for $($Credential.Username)"
}
} catch {
Write-Verbose "Error occurred while performing credential validation. $_"
return $False
}
}
$mycreds = Get-Credential
Write-Host "Adding $NewCompName to the domain"
Read-Host "Press enter to change computer name"
if ($renamecomputer -eq $true)
{Rename-Computer -NewName $NewCompName -DomainCredential $mycreds}
Read-Host "Press enter to restart computer"
Restart-Computer
解决方案
看起来你想要这样的东西
if ($NewCompName -eq "" -or $NewCompName -eq $env:COMPUTERNAME)
{
$NewCompName = $env:COMPUTERNAME; $renamecomputer = $false
}
elseif($NewCompName -inotmatch "^DT|^LT")
{
switch($computertype )
{
1{$NewCompNamePrefix = "DT"}
2{$NewCompNamePrefix = "LT"}
default{}
}
$NewCompName = $NewCompNamePrefix + $NewCompName
}
这-inotmatch
只是确保如果$newcompname
输入的 a 已经看起来像DTwhatever
or LTwhatever
,它不会附加额外的LT
orDT
无关(只是我有点挑剔):
查看Read-host -Prompt
提示并将其嵌套到 do while 循环中,这样您就可以验证输入是否符合您的期望。
像这样的东西
$properChoices = @("a","b","c")
do
{
$choice = (Read-Host -Prompt "pick a, b, or c").ToLower()
switch($choice)
{
"a"{"You picked $choice"}
"b"{"You picked $choice"}
"c"{"You picked $choice"}
default{Write-Warning "Invalid Input"}
}
}
while($choice -notin $properChoices)
推荐阅读
- r - R:如何整合这些数据框?
- javascript - 定位类中除下一个元素之外的所有内容?
- sql - 寻找没有重复的序列 - SQL
- batch-file - 如何使用批处理文件选择性地删除文本文件中的文本?
- java - Else 语句未在 SQL 数据库的 while 循环内执行
- xpath - 如何在 VB6 中将连接字符串评估为索引 XPath 表达式
- string - Java 字符串国际化支持带参数的 RTL
- c++ - 计算机从 1 到 1000 猜测您的号码(必须在 10 次尝试中)
- php - 我需要在控制器中创建一个函数来显示具有由数据库确定的文件名的特定视图。- 拉拉维尔
- php - Codeigniter MySQL 数据集未过滤