1

VBScript を 1 つ作成するのに大変お世話になりました。別の VBScript を作成します。しわを伸ばすのを手伝ってくれるかもしれません。

このスクリプトの目的は、PC の名前を変更することです。コンピュータ名は、プロンプト テキスト (ロケーション コードなど、私が提供するもの)、ハイフン、および WMIC から呼び出されたコンピュータのシリアル番号の最後の 10 桁の組み合わせです。すなわち 1275-XXXXXXXXXX

ここでの私の問題は次のとおりです。

  1. コードが 10 文字を超えると、エラーになります。私はそれを修正したい。それは私がコーディングした方法であり、WMIC からのプルとは関係がないと確信しています。
  2. WMIC からシリアル番号を取得するときにエラーが発生した場合、たとえば値がないなどの理由で、その場所に何かを入力するように求められます。最後に、Input1 (ロケーション コード) と Input2 (SN プルが失敗した場合に提供するもの) を取得し、途中でハイフンを叩いて適用します。
  3. 失敗した場合、エラー出力は機能しません。どうしてか分かりません。

PC の名前を入力したり、具体的には 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 & " "
    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:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

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: " & strNewPCName
end if

Next

2013 年 5 月 29 日 編集: ご提案に基づいていくつかの変更を加えましたが、36 行目の char 1 "Expected Statement" Code 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 & " "
        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 & "-" & strNewSN
End If                                                           'LINE36'

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

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

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: " & strNewPCName
end if

    Next
4

1 に答える 1

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 文字を使用したいということですが、シリアル番号が9文字より短い場合にのみ、コードは最後の 10 文字を使用します。それをに変更します

If Len(strNewSN) > 10 Then strNewSN = Right(BiosSerial, 10)
strNewPCName = strInput & "-" & 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 & "-" & strNewSN
End If

その行を削除すると、エラーが消えます。

VBSCript では、Ifステートメントは次の 2 つの形式を持つことができます。

  • 閉じるとEnd If

    If condition Then
      instruction
    End If
    

    このフォームを使用する場合、キーワードと同じ行にしinstruction ないでください。Then

  • 閉じずにEnd If:

    If condition Then instruction
    

    この形式を使用する場合は、キーワードと同じ行にある必要がinstruction あり、後に . を付けてはなりませんThenEnd If

コードの 34 行目で、シリアル番号が 10 文字を超える場合は切り捨てて、シリアル番号を切り捨てる必要があるかどうかに関係なく、次の行を実行します (その行は無条件に実行する必要があるため、削除しました)。Thenブランチから):

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

これはこれと同等です:

If Len(strNewSN) > 10 Then
  strNewSN = Right(BiosSerial, 10)
End If
strNewPCName = strInput & "-" & strNewSN
于 2013-05-24T20:29:11.120 に答える