سؤال

أنا أبحث عن طريقة لوضع بعض النصوص في الحافظة فبسكريبت.سيتم نشر VBScript المعني كجزء من البرنامج النصي لتسجيل الدخول الخاص بنا.أرغب في تجنب استخدام أي شيء غير متوفر في نظام Windows XP النظيف.

يحرر:ردا على الأسئلة حول ما هو هذا.

أردنا تشجيع المستخدمين داخل مؤسستنا على استخدام خادم الملفات لنقل المستندات بدلاً من إرسال المرفقات باستمرار عبر البريد الإلكتروني.أحد أكبر العوائق التي تحول دون ذلك هو أنه ليس من الواضح دائمًا للأشخاص ما هو مسار الشبكة الصحيح للملف/المجلد.لقد قمنا بتطوير برنامج نصي سريع، وأرفقناه بقائمة سياق Windows حتى يتمكن المستخدم من النقر بزر الماوس الأيمن على أي ملف/مجلد، والحصول على عنوان URL الذي يمكنه إرساله بالبريد الإلكتروني إلى شخص ما داخل مؤسستنا.

أريد أن يتم أيضًا وضع عنوان URL المعروض في مربع الحوار في الحافظة.

GetNetworkPath

هل كانت مفيدة؟

المحلول

لا توفر 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top