VBScript Переименование компьютера Windows с параметрами

#vbscript

#Windows #vbscript #переименовать

Вопрос:

Вы, ребята, отлично помогли мне с одним VBScript, поэтому я собираюсь добавить еще один. Возможно, вы можете помочь мне сгладить морщины.

Я намереваюсь с помощью этого скрипта переименовать компьютер. Имя компьютера представляет собой комбинацию текста запроса (что-то, что я предоставляю, скажем, код местоположения), дефиса и последних 10 цифр серийного номера компьютера, вызываемого из WMIC. т.е. 1275-XXXXXXXXXX

Мои проблемы здесь заключаются в следующем:

  1. Если мой код превышает 10 символов, он просто выдает ошибку. Я хочу это исправить. Я уверен, что это именно так, как я его закодировал, и ничего общего с извлечением из WMIC.
  2. Если он выдает ошибку при извлечении серийного номера из WMIC, скажем, потому что нет значения, я хочу, чтобы мне было предложено ввести что-то на его месте. Затем в конце он примет Input1 (код местоположения) и Input2 (то, что я предоставляю, если не удается выполнить SN), поставьте дефис посередине и примените его.
  3. Моя ошибка не работает, если она не работает. Я не знаю почему.

Я нашел так много разных решений для переименования ПК либо в то, что я ввожу, либо специально для извлечения SN, но не для моей конкретной ситуации. Как всегда, буду признателен за любую помощь. 🙂

Вот мой код:

 'Rename computer by serial # v1.0 November 2009
dim Bios, BiosSerial, objFSO, objTextFile
'Const ForReading = 1, ForWriting = 2, ForAppending = 8

'get PropertyID
strInput = UserInput( "Enter the BHMS Property ID:" )

Function UserInput( myPrompt )
' This function prompts the user for some input.
' When the script runs in CSCRIPT.EXE, StdIn is used,
' otherwise the VBScript InputBox( ) function is used.
' myPrompt is the the text used to prompt the user for input.
' The function returns the input typed either on StdIn or in InputBox( ).
' Written by Rob van der Woude
' http://www.robvanderwoude.com
' Check if the script runs in CSCRIPT.EXE
If UCase( Right( WScript.FullName, 12 ) ) = "CSCRIPT.EXE" Then
    ' If so, use StdIn and StdOut
    WScript.StdOut.Write myPrompt amp; " "
    UserInput = WScript.StdIn.ReadLine
Else
    ' If not, use InputBox( )
    UserInput = InputBox( myPrompt )
End If
End Function

'Obtain Serial Number.
for each Bios in GetObject("winmgmts:").InstancesOf ("win32_bios")
BiosSerial = Bios.SerialNumber
exit for
next

strNewSN = BiosSerial

' If the SN is longer than 10 characters, truncate to the last 10.
If Len(strNewSN) < 9 Then
    strNewSN = Right(BiosSerial, 10)
    strNewPCName = strInput "-" strNewSN
End If

Set WshNetwork = WScript.CreateObject("WScript.Network")

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
amp; "{impersonationLevel=impersonate}!\" amp; strComputer amp; "rootcimv2")

Set colComputers = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")

For Each objComputer in colComputers
err = objComputer.Rename(strNewPCName)

if err <> 0 then
wscript.echo "There was an error renaming the PC. Please restart and try again, or rename it manually."
else
wscript.echo "PC successfully renamed: " amp; strNewPCName
end if

Next
 

29.05.2013 РЕДАКТИРОВАТЬ: я внес некоторые изменения на основе вашего предложения, и я получаю сообщение об ошибке в строке 36 символа 1 «Ожидаемое утверждение» с кодом 800A0400. Для меня это выглядит нормально, так чего же мне не хватает? Вот новая вставка моего кода с обозначением строки 36.

 dim Bios, BiosSerial, objFSO, objTextFile
'Const ForReading = 1, ForWriting = 2, ForAppending = 8

' Prompt for PropertyID
strInput = UserInput( "Enter the BHMS Property ID:" )

Function UserInput( myPrompt )
    ' Check if the script runs in CSCRIPT.EXE
    If UCase( Right( WScript.FullName, 12 ) ) = "CSCRIPT.EXE" Then
        ' If so, use StdIn and StdOut
        WScript.StdOut.Write myPrompt amp; " "
        UserInput = WScript.StdIn.ReadLine
    Else
        ' If not, use InputBox( )
        UserInput = InputBox( myPrompt )
    End If
End Function

' Obtain Serial Number.
for each Bios in GetObject("winmgmts:").InstancesOf ("win32_bios")
BiosSerial = Bios.SerialNumber
exit for
next

strNewSN = BiosSerial

If IsEmpty(BiosSerial) Then
  strNewSN = UserInput("There is no serial number listed in the BIOS. Provide an alternative: ")
Else
  strNewSN = BiosSerial
End If

' If the SN is longer than 10 characters, truncate to the last 10.
If Len(strNewSN) > 10 Then strNewSN = Right(BiosSerial, 10)
strNewPCName = strInput amp; "-" amp; strNewSN
End If                                                           'LINE36'

Set WshNetwork = WScript.CreateObject("WScript.Network")

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
amp; "{impersonationLevel=impersonate}!\" amp; strComputer amp; "rootcimv2")

Set colComputers = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")

For Each objComputer in colComputers
err = objComputer.Rename(strNewPCName)

On Error <> 0 Then
wscript.echo "There was an error renaming the PC. Please restart and try again, or rename it manually."
Else
wscript.echo "PC successfully renamed: " amp; strNewPCName
end if

    Next
 

Ответ №1:

Если мой код превышает 10 символов, он просто выдает ошибку. Я хочу это исправить. Я уверен, что это именно так, как я его закодировал, и ничего общего с извлечением из WMIC.

 ' If the SN is longer than 10 characters, truncate to the last 10.
If Len(strNewSN) < 9 Then
  strNewSN = Right(BiosSerial, 10)
  strNewPCName = strInput "-" strNewSN
End If
 

В вашем комментарии говорится, что вы хотите использовать последние 10 символов из серийного номера, если серийный номер длиннее этого, но ваш код принимает последние 10 символов, только если серийный номер короче 9 символов. Измените это на

 If Len(strNewSN) > 10 Then strNewSN = Right(BiosSerial, 10)
strNewPCName = strInput amp; "-" amp; strNewSN
 

Если он выдает ошибку при извлечении серийного номера из WMIC, скажем, потому что нет значения, я хочу, чтобы мне было предложено ввести что-то на его месте. Затем в конце он примет Input1 (код местоположения) и Input2 (то, что я предоставляю, если не удается выполнить SN), поставьте дефис посередине и примените его.

Вы могли бы использовать IsEmpty() , чтобы проверить, имеет ли BiosSerial переменная значение:

 If IsEmpty(BiosSerial) Then
  strNewSN = UserInput("Enter fake serial number:")
Else
  strNewSN = BiosSerial
End If
 

Моя ошибка не работает, если она не работает. Я не знаю почему.

Определить «не работает». Какой результат вы получаете и чем он отличается от ожидаемого результата?

Кстати, вы не должны использовать err в качестве имени для переменной. Err это встроенный объект, который VBScript предоставляет в контексте обработки ошибок завершения.


Редактировать: у вас есть ложное End If значение в строке 36:

 If Len(strNewSN) > 10 Then strNewSN = Right(BiosSerial, 10)
strNewPCName = strInput amp; "-" amp; strNewSN
End If 

Удалите эту строку, и ошибка исчезнет.

В VBScript If оператор может иметь две формы:

  • С закрытием End If :
     If condition Then
      instruction
    End If
     

    При использовании этой формы ключевое слово instruction не должно находиться в той же строке, Then что и ключевое слово.

  • Без закрытия End If :
     If condition Then instruction
     

    При использовании этой формы, instruction должно быть в той же строке, Then что и ключевое слово, и не должно сопровождаться End If .

В строке 34 вашего кода вы усекаете серийный номер до 10 символов, если он длиннее, а затем выполняете следующую строку независимо от того, нужно было усекать серийный номер или нет (эта строка должна выполняться безоговорочно, поэтому я удалил ее из Then ветки):

 If Len(strNewSN) > 10 Then strNewSN = Right(BiosSerial, 10)
strNewPCName = strInput amp; "-" amp; strNewSN 

что эквивалентно этому:

 If Len(strNewSN) > 10 Then
  strNewSN = Right(BiosSerial, 10)
End If
strNewPCName = strInput amp; "-" amp; strNewSN
 

Комментарии:

1. Я опубликовал новый фрагмент кода в своей правке. Не могли бы вы взглянуть и посмотреть, что я делаю не так? Большое спасибо за вашу помощь и понимание! 🙂