Использование Read-host с проверкой ввода и TRAP - PullRequest
0 голосов
/ 23 мая 2018

Я просто типичный администратор, пытающийся сделать простой сценарий для некоторых ИТ-помощников в удаленных офисах, чтобы облегчить присоединение к домену и минимизировать возможные ошибки.Конечная игра сценария - запустить однострочную команду Add-Computer -DomainName $DomainToJoin -OUPath $LocDN -NewName $WS_NewName -Restart.

Но весь сценарий должен включать проверку ввода для нового имени компьютера, а также для целевого подразделения для двухбуквенного кода для удаленного офиса.

Поиск в Google фрагментов кода в течение нескольких дней, особеннос сайтов, подобных вашему, было очень полезно.Но проблема, с которой я столкнулся сейчас, заключается в том, что я не смог найти правильные коды, чтобы объединить Read-Host, проверку длины ввода и TRAP для совместной работы, не теряя значения для моих переменных.Я не настоящий сценарист PS, и я знаю, что неправильные его части очень просты.Я хотел бы провести больше времени, если бы у меня была роскошь, но я бы очень признателен, если бы вы указали мне правильное направление.

Большое спасибо заранее.

Пожалуйста, смотрите мой код ниже:

# START: Display name and purpose of invoked script
$path =  $MyInvocation.MyCommand.Definition 
Clear-Host
Write-Host $path
Write-Host " " 
Write-Host "This script will allow you to do the following in a single-step process:"
Write-Host "(1) RENAME this computer"
Write-Host "(2) JOIN it to MYDOMAIN"
Write-Host "(3) MOVE it to a target OU"
Write-Host "(4) REBOOT" 
Write-Host " "
Pause


# Function: PAUSE
Function Pause ($Message = "Press any key to continue . . . ") {
if ((Test-Path variable:psISE) -and $psISE) {
    $Shell = New-Object -ComObject "WScript.Shell"
    $Button = $Shell.Popup("Click OK to continue.", 0, "Script Paused", 0)
}
else {     
    Write-Host -NoNewline $Message
    [void][System.Console]::ReadKey($true)
    Write-Host
}
Write-Host " " 
}

# Function: Define the parameters
Function Define-Parameters {   

# Specify new computer name, with validation and TRAP
$WS_NewName = $null
while ($null -eq $WS_NewName) {
[ValidateLength(8,15)]$WS_NewName = [string](Read-Host -Prompt "NEW NAME of computer (8-15 chars.)" )
TRAP {"" ;continue} 
}
Write-Host " "

# Domain to join.
$DomainToJoin = 'mydomain.net' 

# Specify the target OU, with validation and trap
$baseOU='OU=Offices OU,DC=mydomain,DC=net'
$OU2 = $null
while ($null -eq $OU2) {
[ValidateLength(2,2)]$OU2 = [string](Read-Host -Prompt 'Target OU (TWO-LETTER code for your office)' )
TRAP {"" ;continue} 
}
Write-Host " "
$LocDN = "OU=$OU2,$baseOU"  
}



# Function: Summary and confirmation screen for defined parameters.
Function Confirm-Parameters {
Write-Host "==========================================================================="
Write-Host "Please confirm that you are joining this computer to 
$DomainToJoin (MYDOMAIN)"
Write-Host "with the following parameters:" 
Write-Host ""
Write-Host ""
Write-Host "Computer's NEW NAME:   $WS_NewName" 
# Write-Host "Domain to Join:      $DomainToJoin" 
Write-Host "TARGET mission OU:     $OU2" 
}


# Call Define-Parameters Function
Define-Parameters

# Call Confirm-Parameters Function
Confirm-Parameters

<#
Some more code here
#>


# FINAL COMMAND if all else works: Join the computer to the domain, rename it, and restart it. 
# Add-Computer -DomainName $DomainToJoin -OUPath $LocDN -NewName $WS_NewName -Restart

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

В вашем коде многие вещи определены очень странно.Ваши функции создают новую область видимости, и переменные, которые вы пытаетесь определить в ней, исчезнут после их вызова, если вы не измените область видимости переменной (в данном случае, на $script: или $global:).Кроме того, чтобы использовать функции, вам нужно сначала определить их (ваш Pause на самом деле ничего не делает)

Вот что вы можете сделать с помощью функции Define-Parameters (я предлагаю посмотреть на Get-Verb)

# Domain to join.
$DomainToJoin = 'mydomain.net' 

# Function: Define the parameters
Function Get-Parameters {
    do {
        $global:WS_NewName = Read-Host -Prompt 'NEW NAME of computer (8-15 chars)'
    } until ($WS_NewName.Length -gt 7 -and $WS_NewName.Length -lt 16)
    ''

    do {
        $global:OU2 = Read-Host -Prompt 'Target OU (TWO-LETTER code for your office)'
    } until ($OU2 -match '^[a-z]{2}$')
    ''
    $OU2 = "OU=$global:OU2,OU=Offices OU,DC=mydomain,DC=net"
}

Я настоятельно рекомендую отойти от ISE, чтобы провести ваше тестирование и тестирование в реальной консоли powershell.

0 голосов
/ 23 мая 2018

Возможно блок Try / Catch вместо ловушки?

Try {
    [ValidatePattern('^\w{8,15}$')]$compname=read-host 'enter comp name' -ErrorAction Stop
    [ValidatePattern('^\w{2}$')]$OU=read-host 'enter OU name' -ErrorAction Stop
}
Catch {
$ErrorMessage = $_.Exception.Message
    $ErrorLineNumber = $_.InvocationInfo.ScriptLineNumber
    $ErrorCommandName = $_.InvocationInfo.InvocationName
    Write-Error -Message "The error message was: <$ErrorMessage>, script line: <$ErrorLineNumber>, command name: <$ErrorCommandName>"
    exit 255
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...