استخدم الحافظة من VBScript
-
02-07-2019 - |
سؤال
أنا أبحث عن طريقة لوضع بعض النصوص في الحافظة فبسكريبت.سيتم نشر VBScript المعني كجزء من البرنامج النصي لتسجيل الدخول الخاص بنا.أرغب في تجنب استخدام أي شيء غير متوفر في نظام Windows XP النظيف.
يحرر:ردا على الأسئلة حول ما هو هذا.
أردنا تشجيع المستخدمين داخل مؤسستنا على استخدام خادم الملفات لنقل المستندات بدلاً من إرسال المرفقات باستمرار عبر البريد الإلكتروني.أحد أكبر العوائق التي تحول دون ذلك هو أنه ليس من الواضح دائمًا للأشخاص ما هو مسار الشبكة الصحيح للملف/المجلد.لقد قمنا بتطوير برنامج نصي سريع، وأرفقناه بقائمة سياق Windows حتى يتمكن المستخدم من النقر بزر الماوس الأيمن على أي ملف/مجلد، والحصول على عنوان URL الذي يمكنه إرساله بالبريد الإلكتروني إلى شخص ما داخل مؤسستنا.
أريد أن يتم أيضًا وضع عنوان URL المعروض في مربع الحوار في الحافظة.
المحلول
لا توفر Microsoft طريقة لـ VBScript للوصول مباشرة إلى الحافظة.إذا قمت بالبحث عن 'clipboard'
على هذا الموقع الذي ستشاهده:
على الرغم من أن Visual Basic for Applications يدعم كائنات الشاشة والطابعة والتطبيق وDebug وErr وClipboard، إلا أن VBScript يدعم كائن Err فقط.لذلك، لا يسمح لك VBScript بالوصول إلى كائنات مفيدة مثل مؤشر الماوس أو الحافظة.ومع ذلك، يمكنك استخدام كائن Err لتوفير معالجة الأخطاء في وقت التشغيل لتطبيقاتك.
لذا فإن استخدام المفكرة بشكل غير مباشر ربما يكون أفضل ما يمكنك فعله باستخدام VBScript فقط.
نصائح أخرى
هناك حل آخر وجدته غير مثالي في رأيي، ولكنه لا يحتوي على تحذيرات أمنية مزعجة، وهو استخدام clip.exe من خادم w2k3.
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo hello world | clip", 0, TRUE
http://www.petri.co.il/quickly_copy_error_and_display_messages.htm
مثال مع سلسلة متعددة الأسطر حسب السؤال أدناه
Dim string
String = "text here" &chr(13)& "more text here"
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo " & String & " | clip", 0, TRUE
الحل الأقرب الذي وجدته حتى الآن هو طريقة لاستخدام IE للحصول على الأشياء وتعيينها في الحافظة.مشكلة هذا الحل هي أن المستخدم يتلقى تحذيرات أمنية.أميل إلى نقل "about:blank" إلى منطقة أمان الكمبيوتر المحلية حتى لا أحصل على التحذيرات، لكنني لست متأكدًا من الآثار الأمنية المترتبة على ذلك.
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", "Hello This Is A Test"
objIE.Quit
http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx
يعد استخدام clip.exe من Microsoft هو الأقرب للحصول على حل نظيف لنظام Windows XP.ومع ذلك، لا يتعين عليك الاتصال بـ CMD.EXE لاستضافته حتى تتمكن من استخدامه.يمكنك الاتصال به مباشرة والكتابة إلى دفق الإدخال الخاص به في رمز البرنامج النصي الخاص بك.بمجرد إغلاق دفق الإدخال، سيقوم clip.exe بكتابة المحتويات مباشرة إلى الحافظة.
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("clip")
Set oIn = oExec.stdIn
oIn.WriteLine "Something One"
oIn.WriteLine "Something Two"
oIn.WriteLine "Something Three"
oIn.Close
إذا كنت بحاجة إلى الانتظار حتى انتهاء المقطع قبل أن يتمكن البرنامج النصي من متابعة المعالجة، فقم بإضافته
' loop until we're finished working.
Do While oExec.Status = 0
WScript.Sleep 100
Loop
ولا تنس إطلاق الأشياء الخاصة بك
Set oIn = Nothing
Set oExec = Nothing
لتجنب التحذيرات الأمنية المرتبطة بـ Internet Explorer والوصول إلى الحافظة، أوصي باستخدام كائن تطبيق Word وطرقه لوضع بياناتك في الحافظة.بالطبع يمكنك فقط استخدام هذا على جهاز مثبت عليه برنامج MS Word، ولكن هذه الأيام هي الأكثر استخدامًا.(*على الرغم من أنك طلبت أشياء على نظام "نظيف" :) *)
' Set what you want to put in the clipboard '
strMessage = "Imagine that, it works!"
' Declare an object for the word application '
Set objWord = CreateObject("Word.Application")
' Using the object '
With objWord
.Visible = False ' Don't show word '
.Documents.Add ' Create a document '
.Selection.TypeText strMessage ' Put text into it '
.Selection.WholeStory ' Select everything in the doc '
.Selection.Copy ' Copy contents to clipboard '
.Quit False ' Close Word, don't save '
End With
يمكنك العثور على تفاصيل حول كائن تطبيق MS Word وطرقه هنا: http://msdn.microsoft.com/en-us/library/aa221371(office.11).aspx
إليك إصدار آخر لاستخدام الأمر "clip"، والذي يتجنب إضافة حرف إرجاع وتغذية السطر إلى نهاية السلسلة:
strA= "some character string"
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd /C echo . | set /p x=" & strA & "| c:\clip.exe", 2
s = "String: """ & strA & """ is on the clipboard."
Wscript.Echo s
لقد اختبرت هذا فقط في XP.تم تنزيل clip.exe من http://www.petri.co.il/downloads/clip.zip ووضعها في C:\ .
لا توجد تحذيرات أمنية، السماح الكامل والوصول:
'create a clipboard thing
Dim ClipBoard
Set Clipboard = New cClipBoard
ClipBoard.Clear
ClipBoard.Data = "Test"
Class cClipBoard
Private objHTML
Private Sub Class_Initialize
Set objHTML = CreateObject("htmlfile")
End Sub
Public Sub Clear()
objHTML.ParentWindow.ClipboardData.ClearData()
End Sub
Public Property Let Data(Value)
objHTML.ParentWindow.ClipboardData.SetData "Text" , Value
End Property
Public Property Get Data()
Data = objHTML.ParentWindow.ClipboardData.GetData("Text")
End Property
Private Sub Class_Terminate
Set objHTML = Nothing
End Sub
End Class
مثال الاستخدام.
' Create scripting object
Dim WShell, lRunUninstall
Set WShell = CreateObject("WScript.Shell")
WShell.sendkeys "^c"
WScript.Sleep 250
bWindowFound = WShell.AppActivate("Microsoft Excel")
WShell.sendkeys ClipBoard.Data
لقد وجدت طريقة لنسخ معلومات متعددة الأسطر إلى الحافظة عن طريق vbscript/cmd.
تسلسل:
- باستخدام VBS قم بإنشاء "السلسلة المنسقة" النهائية التي تحتاج إلى نسخها إلى الحافظة
- إنشاء ملف (txt) باستخدام "السلسلة المنسقة"
- استخدم أمر الكتابة من cmd للصق المعلومات لقصها عبر الأنبوب
مثال البرنامج النصي:
Function CopyToClipboard( sInputString )
Dim oShell: Set oShell = CreateObject("WScript.Shell")
Dim sTempFolder: sTempFolder = oShell.ExpandEnvironmentStrings("%TEMP%")
Dim sFullFilePath: sFullFilePath = sTempFolder & "\" & "temp_file.txt"
Const iForWriting = 2, bCreateFile = True
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
With oFSO.OpenTextFile(sFullFilePath, iForWriting, bCreateFile)
.Write sInputString
.Close
End With
Const iHideWindow = 0, bWaitOnReturnTrue = True
Dim sCommand: sCommand = "CMD /C TYPE " & sFullFilePath & "|CLIP"
oShell.Run sCommand, iHideWindow, bWaitOnReturnTrue
Set oShell = Nothing
Set oFSO = Nothing
End Function
Sub Main
Call CopyToClipboard( "Text1" & vbNewLine & "Text2" )
End Sub
Call Main
لقد ابتكرت طريقة أخرى لاستخدام IE مع تجنب التحذيرات الأمنية ...
بالمناسبة..هذه الوظيفة في جافا سكريبت..ولكن يمكنك بسهولة تحويله إلى VBScript..
function CopyText(sTxt) {
var oIe = WScript.CreateObject('InternetExplorer.Application');
oIe.silent = true;
oIe.Navigate('about:blank');
while(oIe.ReadyState!=4) WScript.Sleep(20);
while(oIe.document.readyState!='complete') WSript.Sleep(20);
oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>";
var oTb = oIe.document.getElementById('txtArea');
oTb.value = sTxt;
oTb.select();
oTb = null;
oIe.ExecWB(12,0);
oIe.Quit();
oIe = null;
}
هذه هي طريقة Srikanth المترجمة إلى vbs
function SetClipBoard(sTxt)
Set oIe = WScript.CreateObject("InternetExplorer.Application")
oIe.silent = true
oIe.Navigate("about:blank")
do while oIe.ReadyState <> 4
WScript.Sleep 20
loop
do while oIe.document.readyState <> "complete"
WScript.Sleep 20
loop
oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>"
set oTb = oIe.document.getElementById("txtArea")
oTb.value = sTxt
oTb.select
set oTb = nothing
oIe.ExecWB 12,0
oIe.Quit
Set oIe = nothing
End function
function GetClipBoard()
set oIe = WScript.CreateObject("InternetExplorer.Application")
oIe.silent = true
oIe.Navigate("about:blank")
do while oIe.ReadyState <> 4
WScript.Sleep 20
loop
do while oIe.document.readyState <> "complete"
WScript.Sleep 20
loop
oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>"
set oTb = oIe.document.getElementById("txtArea")
oTb.focus
oIe.ExecWB 13,0
GetClipBoard = oTb.value
oTb.select
set oTb = nothing
oIe.Quit
Set oIe = nothing
End function
أسهل طريقة هي استخدام المدمج في mshta.exe
وظائف:
sText = "Text Content"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(sText, "\", "\\"), "'", "\'") & "');close();""", 0, True
لوضع سلسلة تحتوي على علامات اقتباس مزدوجة في الحافظة "
, ، استخدم الكود أدناه:
sText = "Text Content and double quote "" char"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(Replace(sText, "\", "\\"), """", """"""), "'", "\'") & "'.replace('""""',String.fromCharCode(34)));close();""", 0, True
نلقي نظرة على هذا المشنور.ويصف نهجا hacky ل يقرأ من الحافظة، ولكني أتصور أنه يمكن تكييفها للكتابة أيضًا في الحافظة أيضًا، مثل تغيير Ctrl+V إلى Ctrl+A ثم Ctrl+C.
في صفك ClipBoard
, ، لا يعمل القسم الفرعي Clear ولا القسم الفرعي Let Data.أعني أنه ليس لها أي تأثير على ويندوز Clipboard
.في الواقع، ومن سخرية القدر، أن الفرع الوحيد الذي يعمل هو الذي لم تقم بتضمينه في مثالك، وهو الحصول على البيانات!(لقد اختبرت هذا الكود عدة مرات.)
ومع ذلك، هذا ليس خطأك.لقد حاولت نسخ البيانات إلى الحافظة باستخدام ClipboardData.SetData وهذا مستحيل.على الأقل ليس عن طريق إنشاء كائن "htmlfile".ربما يعمل عن طريق إنشاء مثيل لـ "InternetExplorer.Application" كما رأيت في حالات قليلة، لكنني لم أجربه.أنا أكره إنشاء مثيلات التطبيق لمثل هذه المهام البسيطة!
الكيس
إذا كان مجرد نص، ألا يمكنك ببساطة إنشاء ملف نصي وقراءة محتوياته عندما تحتاج إليه؟
هناك بديل آخر ومن الواضح أنه خدعة، وهو استخدام SendKeys()
طريقة.
لا توجد تحذيرات أمنية ولا يوجد حرف إرجاع في نهاية السطر
' value to put in Clipboard
mavaleur = "YEAH"
' current Dir
path = WScript.ScriptFullName
GetPath = Left(path, InStrRev(path, "\"))
' Put the value in a file
Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile=GetPath & "fichier.valeur"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write mavaleur
objFile.Close
' Put the file in the Clipboard
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c clip < " & outFile, 0, TRUE
' Erase the file
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile outFile