คำสั่งหรือวิธีที่เร็วที่สุดในการส่งออกผลลัพธ์ไปยังคอนโซลโดยใช้ vbscript คืออะไร?
คำสั่งหรือวิธีที่เร็วที่สุดในการส่งออกผลลัพธ์ไปยังคอนโซลโดยใช้ vbscript คืออะไร?
คำตอบ:
คุณหมายถึง:
Wscript.Echo "Like this?"
หากคุณเรียกใช้ภายใต้wscript.exe
(ตัวจัดการเริ่มต้นสำหรับส่วนขยาย. vbs ดังนั้นสิ่งที่คุณจะได้รับหากคุณดับเบิลคลิกที่สคริปต์) คุณจะได้รับกล่องโต้ตอบ "MessageBox" พร้อมข้อความของคุณ หากคุณเรียกใช้ภายใต้cscript.exe
คุณจะได้รับผลลัพธ์ในหน้าต่างคอนโซล
WScript.Echo
จะต้องใช้ไม่ว่าคุณจะทำงานผ่านWScript
หรือ CScript
นั่นคือมีไม่CScript.Echo
ในกรณีที่ชาว Google ในอนาคตน่าแปลกใจ ( มากมีความสุข msgboxes จะหายไป [เมื่อทำงานกับcscript
] อย่างไรก็ตาม; ขอบคุณ.)
WScript.Echo
หุ้น ฉันคิดว่าถ้าคุณต้องการอยู่ใน WScript อย่างสมบูรณ์คุณสามารถทำสิ่งที่น่ากลัวอย่าง Exec'ing off กระบวนการอื่นเพื่อทำ "SendKeys" ให้กับกระบวนการหลักเพื่อปิด MessageBox
popup
วิธีนี้ คล้ายกันมากกับecho
แต่ให้คุณระบุการหมดเวลาหลังจากนั้นมันจะปิดกล่องป๊อปอัพโดยอัตโนมัติ สะดวกและง่ายต่อการใช้งาน: technet.microsoft.com/en-us/library/ee156593.aspx
นี้ถูกพบในสคริปมังกรไอทีและรหัสพื้นที่เก็บข้อมูล
คุณสามารถทำสิ่งต่อไปนี้และอยู่ห่างจากความแตกต่าง cscript / wscript และช่วยให้คุณได้รับเอาต์พุตคอนโซลเดียวกันกับที่ไฟล์แบทช์จะมี วิธีนี้จะช่วยได้ถ้าคุณโทร VBS จากแบตช์ไฟล์และต้องการทำให้มันดูราบรื่น
Set fso = CreateObject ("Scripting.FileSystemObject")
Set stdout = fso.GetStandardStream (1)
Set stderr = fso.GetStandardStream (2)
stdout.WriteLine "This will go to standard output."
stderr.WriteLine "This will go to error output."
WScript.Echo
จึงมีดูเหมือนจะไม่เป็นประโยชน์มากขึ้นกว่าเพียงแค่ใช้ ในความเป็นจริงความแตกต่างได้รับการขยายเนื่องจากสคริปต์จะไม่ทำงานภายใต้ WScript อีกต่อไป มันเป็นเทคนิคที่ถูกต้องที่มีการใช้งานเช่นถ้าจำเป็นต้องเขียนถึง StdErr แต่ในบริบทของคำตอบนี้มันทำให้เข้าใจผิด
WScript.Echo
: cscript //b foobar.vbs
ทำงานfoobar.vbs
โดยไม่มีคอนโซลเอาต์พุต แต่ด้วยวิธีการของ Rob คุณสามารถมีเอาต์พุตแม้เมื่อผ่าน\\b
ไปยังcscript.exe
คุณจะต้องบังคับ cscript แทน wscript ฉันใช้เทมเพลตนี้เสมอ ฟังก์ชั่น ForceConsole () จะรัน vbs ของคุณเป็น cscript และคุณมีนามแฝงที่ดีในการพิมพ์และสแกนข้อความ
Set oWSH = CreateObject("WScript.Shell")
vbsInterpreter = "cscript.exe"
Call ForceConsole()
Function printf(txt)
WScript.StdOut.WriteLine txt
End Function
Function printl(txt)
WScript.StdOut.Write txt
End Function
Function scanf()
scanf = LCase(WScript.StdIn.ReadLine)
End Function
Function wait(n)
WScript.Sleep Int(n * 1000)
End Function
Function ForceConsole()
If InStr(LCase(WScript.FullName), vbsInterpreter) = 0 Then
oWSH.Run vbsInterpreter & " //NoLogo " & Chr(34) & WScript.ScriptFullName & Chr(34)
WScript.Quit
End If
End Function
Function cls()
For i = 1 To 50
printf ""
Next
End Function
printf " _____ _ _ _____ _ _____ _ _ "
printf "| _ |_| |_ ___ ___| |_ _ _ _| | | __|___ ___|_|___| |_ "
printf "| | | '_| . | | --| | | | . | |__ | _| _| | . | _|"
printf "|__|__|_|_,_|___|_|_|_____|_____|___| |_____|___|_| |_| _|_| "
printf " |_| v1.0"
printl " Enter your name:"
MyVar = scanf
cls
printf "Your name is: " & MyVar
wait(5)
ฉันเจอโพสต์นี้และกลับไปใช้วิธีที่ฉันเคยใช้มาก่อนซึ่งคล้ายกับ @ MadAntrax
ความแตกต่างที่สำคัญคือมันใช้คลาสที่ผู้ใช้กำหนด VBScript เพื่อตัดตรรกะทั้งหมดสำหรับการสลับไปที่ CScript และส่งข้อความไปยังคอนโซลดังนั้นมันจึงทำให้สคริปต์หลักสะอาดขึ้นเล็กน้อย
สิ่งนี้ถือว่าวัตถุประสงค์ของคุณคือการสตรีมเอาต์พุตไปยังคอนโซลแทนที่จะเอาท์พุทไปที่กล่องข้อความ
คลาส cCONSOLE อยู่ด้านล่าง หากต้องการใช้งานให้รวมคลาสที่สมบูรณ์ในตอนท้ายของสคริปต์แล้วสร้างอินสแตนซ์ที่จุดเริ่มต้นของสคริปต์ นี่คือตัวอย่าง:
Option Explicit
'// Instantiate the console object, this automatically switches to CSCript if required
Dim CONS: Set CONS = New cCONSOLE
'// Now we can use the Consol object to write to and read from the console
With CONS
'// Simply write a line
.print "CSCRIPT Console demo script"
'// Arguments are passed through correctly, if present
.Print "Arg count=" & wscript.arguments.count
'// List all the arguments on the console log
dim ix
for ix = 0 to wscript.arguments.count -1
.print "Arg(" & ix & ")=" & wscript.arguments(ix)
next
'// Prompt for some text from the user
dim sMsg : sMsg = .prompt( "Enter any text:" )
'// Write out the text in a box
.Box sMsg
'// Pause with the message "Hit enter to continue"
.Pause
End With
'= =========== End of script - the cCONSOLE class code follows here
นี่คือรหัสสำหรับคลาส cCONSOLE
CLASS cCONSOLE
'= =================================================================
'=
'= This class provides automatic switch to CScript and has methods
'= to write to and read from the CSCript console. It transparently
'= switches to CScript if the script has been started in WScript.
'=
'= =================================================================
Private oOUT
Private oIN
Private Sub Class_Initialize()
'= Run on creation of the cCONSOLE object, checks for cScript operation
'= Check to make sure we are running under CScript, if not restart
'= then run using CScript and terminate this instance.
dim oShell
set oShell = CreateObject("WScript.Shell")
If InStr( LCase( WScript.FullName ), "cscript.exe" ) = 0 Then
'= Not running under CSCRIPT
'= Get the arguments on the command line and build an argument list
dim ArgList, IX
ArgList = ""
For IX = 0 to wscript.arguments.count - 1
'= Add the argument to the list, enclosing it in quotes
argList = argList & " """ & wscript.arguments.item(IX) & """"
next
'= Now restart with CScript and terminate this instance
oShell.Run "cscript.exe //NoLogo """ & WScript.ScriptName & """ " & arglist
WScript.Quit
End If
'= Running under CScript so OK to continue
set oShell = Nothing
'= Save references to stdout and stdin for use with Print, Read and Prompt
set oOUT = WScript.StdOut
set oIN = WScript.StdIn
'= Print out the startup box
StartBox
BoxLine Wscript.ScriptName
BoxLine "Started at " & Now()
EndBox
End Sub
'= Utility methods for writing a box to the console with text in it
Public Sub StartBox()
Print " " & String(73, "_")
Print " |" & Space(73) & "|"
End Sub
Public Sub BoxLine(sText)
Print Left(" |" & Centre( sText, 74) , 75) & "|"
End Sub
Public Sub EndBox()
Print " |" & String(73, "_") & "|"
Print ""
End Sub
Public Sub Box(sMsg)
StartBox
BoxLine sMsg
EndBox
End Sub
'= END OF Box utility methods
'= Utility to center given text padded out to a certain width of text
'= assuming font is monospaced
Public Function Centre(sText, nWidth)
dim iLen
iLen = len(sText)
'= Check for overflow
if ilen > nwidth then Centre = sText : exit Function
'= Calculate padding either side
iLen = ( nWidth - iLen ) / 2
'= Generate text with padding
Centre = left( space(iLen) & sText & space(ilen), nWidth )
End Function
'= Method to write a line of text to the console
Public Sub Print( sText )
oOUT.WriteLine sText
End Sub
'= Method to prompt user input from the console with a message
Public Function Prompt( sText )
oOUT.Write sText
Prompt = Read()
End Function
'= Method to read input from the console with no prompting
Public Function Read()
Read = oIN.ReadLine
End Function
'= Method to provide wait for n seconds
Public Sub Wait(nSeconds)
WScript.Sleep nSeconds * 1000
End Sub
'= Method to pause for user to continue
Public Sub Pause
Prompt "Hit enter to continue..."
End Sub
END CLASS
มีห้าวิธีในการแสดงผลข้อความไปยังคอนโซล:
Dim StdOut : Set StdOut = CreateObject("Scripting.FileSystemObject").GetStandardStream(1)
WScript.Echo "Hello"
WScript.StdOut.Write "Hello"
WScript.StdOut.WriteLine "Hello"
Stdout.WriteLine "Hello"
Stdout.Write "Hello"
WScript.Echo จะส่งออกไปยังคอนโซล แต่เฉพาะเมื่อสคริปต์เริ่มใช้ cscript.exe มันจะส่งออกไปยังกล่องข้อความถ้าเริ่มใช้ wscript.exe
WScript.StdOut.Write และ WScript.StdOut.WriteLine จะส่งออกไปยังคอนโซลเสมอ
StdOut.Write และ StdOut.WriteLine จะส่งเอาต์พุตไปยังคอนโซลเสมอ ต้องใช้การสร้างวัตถุเพิ่มเติม แต่เร็วกว่า WScript.Echo ประมาณ 10%
MsgBox("text")
หรือMsgBox(object.property)
แต่Wscript.Echo
จะง่ายต่อการเขียน ขอบคุณ