قم بتحويل لوحة Keith Hill's PowerShell Get-Clipboard و Set-Clipboard إلى نص PSM1

StackOverflow https://stackoverflow.com/questions/1567112

سؤال

أرغب في تحويل تطبيق Keith Hill C# من Get-Clipboard و Set-Clipboard إلى Pure PowerShell كملف .psm1.

هل هناك طريقة لتدوير خيط STA في PowerShell كما يفعل في cmdlet له عند العمل مع الحافظة؟

منشور المدونة
الرمز

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

المحلول

لا يتطلب TextBox مفتاح التبديل.

function Get-ClipBoard {
    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Paste()
    $tb.Text
}


function Set-ClipBoard() {
    Param(
      [Parameter(ValueFromPipeline=$true)]
      [string] $text
    )
    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Text = $text
    $tb.SelectAll()
    $tb.Copy()
}

نصائح أخرى

انظر القسم السفلي لـ وحدة العرض المتبادلة ، الوحدة النمطية عبر المنصات التي توفر الحافظة نص الدعم في PowerShell Core وفي Windows PowerShell V2 - V4.

محاولة لتلخيص الحالة والخيارات اعتبارا من شبابيك PowerShell V5.1 / PowerShell النواة v6.1.0:

  • شبابيك PowerShell v5.0+: استخدم ال مدمج Get-Clipboard و Set-Clipboard cmdlets.

  • شبابيك PowerShell v4.0- (v1 - v4.0): HAS لا cmdlets مدمجة للتفاعل مع الحافظة, ، ولكن هناك الحلول:

    • يستخدم باورشيل امتدادات المجتمع (PSCX ؛ http://pscx.codeplex.com/) ، والتي تأتي مع العديد من cmdlets المتعلقة بالحافظة التي تتجاوز مجرد التعامل مع النص.
    • أنبوب إلى فائدة سطر الأوامر القياسية clip.exe (W2K3+ Server-Side ، Vista+ من جانب العميل) [1]:

      • ملاحظة: بصرف النظر عن مشكلات الترميز التي تمت مناقشتها أدناه ، ... | clip.exe بثبات إلحاق خط جديد إلى المدخلات ؛ الطريقة الوحيدة لتجنب ذلك هي استخدام ملف مؤقت يتم توفير محتواه عبر CMD< إعادة توجيه المدخلات - انظر Set-ClipboardText وظيفة أدناه.

      • إذا كان هناك حاجة إلى دعم ASCII-charcter (7 بت) فقط: يعمل بشكل افتراضي.

      • فقط لو دعم ترميز OEM (8 بت) (على سبيل المثال ، هناك حاجة إلى IBM437 في الولايات المتحدة) ، قم بتشغيل ما يلي أولاً:

        • $OutputEncoding = [System.Text.Encoding]::GetEncoding([System.Globalization.CultureInfo]::CurrentCulture.TextInfo.OEMCodePage)
      • لو دعم Unicode الكامل مطلوب ، أ UTF-16 LE الترميز بدون بوم لابد من استخدامه؛ قم بتشغيل ما يلي أولاً:

        • $OutputEncoding = New-Object System.Text.UnicodeEncoding $false, $false # UTF-16 encoding *without BOM*
        • مثال لاختباره (سوف تحكم PS عرض شارز الآسيوية. كـ "؟؟" ، ولكن لا يزال يتعامل معها بشكل صحيح - تحقق من محتوى الحافظة في المفكرة ، على سبيل المثال):

          • "I enjoyed Thomas Hübl's talk about 中文" | clip # should appear as is on the clipboard
      • ملاحظة: تعيين إلى $OutputEncoding كما أعلاه يعمل بشكل جيد في عالمي النطاق ، ولكن ليس خلاف ذلك ، كما في أ وظيفة, ، بسبب أ خلل برمجي اعتبارًا من Windows PowerShell V5.1 / PowerShell Core V6.0.0 -RC.2 - انظر https://github.com/powershell/powershell/issues/5763

        • في سياق غير عاقل ، استخدم (New-Object ...).psobject.BaseObject للعمل حول الخطأ ، أو - في PSV5+ - الاستخدام [...]:new() في حين أن.
      • ملحوظة: clip.exe يبدو أن يفهم 2 تنسيقات:

        • الحالي للنظام Codepage OEM (على سبيل المثال ، IBM 437)
        • UTF-16 LE ("يونيكود")
        • للأسف، clip.exe يعامل دائمًا بوم البيانات, وبالتالي الحاجة إلى استخدام bom-أقل التشفير.
        • لاحظ أن الترميزات المذكورة أعلاه مهمة فقط فيما يتعلق بالاكتشاف بشكل صحيح إدخال; ؛ مرة واحدة على الحافظة, ، سلسلة الإدخال متوفرة في الكل من الترميزات التالية: UTF-16 LE ، "ANSI" ، و OEM.
    • إستخدم الحل القائم على PowerShell مع الاستخدام المباشر لفئات .NET:

      • لاحظ أن الوصول إلى الحافظة لا يمكن أن يحدث إلا من موضوع في وضع STA (شقة واحدة)-بدلاً من MTA (شقة متعددة الخيوط):

        • V3: Sta هو الافتراضي (يمكن إدخال وضع MTA بالاستدعاء powershell.exe مع ال -mta تحول).
        • V2 و V1: MTA هو الافتراضي; ؛ يمكن إدخال وضع STA عن طريق التذرع powershell.exe مع ال -sta تحول.
        • ERGO: يجب أن تكون الوظائف القوية قادرة على الوصول إلى الحافظة من الجلسات في أي من الوضعين.
  • PowerShell النواة (منصة متعددة)، اعتبارا من V6.1.0, ، لديها لا cmdlets مدمجة للتفاعل مع الحافظة, ، ولا حتى عند الركض شبابيك.

    • الحل البديل هو استخدام الأدوات المساعدة الخاصة للمنصة أو واجهات برمجة التطبيقات - انظر أدناه.

لي ClipboardText وحدة يوفروظائف "polyfill" Get-ClipboardText و Set-ClipboardText للحصول على الإعداد نص من الحافظة; ؛ انهم يعملون عليها Windows PowerShell V2+ وكذلك على PowerShell Core (مع القيود ، انظر أدناه).

في أبسط حالة (PSV5+ أو V3/V4 مع تثبيت وحدات إدارة الحزمة) ، يمكنك تثبيته من معرض PowerShell من مرتفعة / sudo الجلسة على النحو التالي:

Install-Module ClipboardText

لمزيد من المعلومات ، بما في ذلك المتطلبات المسبقة وتعليمات التثبيت اليدوي ، انظر الريبو.

  • ملاحظة: بالمعنى الدقيق للكلمة ، فإن الوظائف ليست polyfills, ، بالنظر إلى أن أسمائهم تختلف عن cmdlets المدمجة. ومع ذلك ، اسم لاحقة الاسم نص تم اختياره لجعل من الواضح أن هذه الوظائف تتعامل مع النص فقط.

  • يعتمد الرمز بامتنان على معلومات من مواقع مختلفة ، لا سيما إجابة @Hoge (https://stackoverflow.com/a/1573295/45375) و http://techibee.com/powershell/powershell-script-to-copy-powershell-command-output-to-clipboard/1316

  • يعمل على Windows PowerShell V5+ في وضع STA:

    • cmdlets المدمجة (Get-Clipboard / Set-Clipboard) تسمى وراء الكواليس.
      لاحظ أن وضع STA (نموذج سلسلة رسائل COM) هو الافتراضي منذ V3 ، ولكن يمكنك الاشتراك في MTA (وضع متعدد الخيوط) مع خيار سطر الأوامر -MTA.
  • في جميع الحالات الأخرى (Windows PowerShell V4- و/أو في وضع MTA ، PowerShell النواة على جميع المنصات المدعومة):

    • شبابيك:
      • الحل القائم على AP/Invoke الذي يستدعي Windows API ، عبر رمز C# Ad-Hoc# الذي تم تجميعه مع Add-Type.
    • منصات شبيهة بـ UNIX: يتم استدعاء المرافق الأصلية وراء الكواليس:
      • ماكوس: pbcopy و pbpaste
      • لينكس: xclip, لو متاح وتثبيت;
        على سبيل المثال ، في Ubuntu ، استخدم sudo apt-get xclip لتثبيت.
  • Set-ClipboardText تستطيع قبول أي نوع من الكائنات (ق) كمدخلات (الذي يتم/يتم تحويله بعد ذلك إلى نص بنفس الطريقة التي ستقدمها في وحدة التحكم) ، إما مباشرة ، أو من خط الأنابيب.

  • استدعاء مع -Verbose لمعرفة التقنية المستخدمة خلف الكواليس للوصول إلى الحافظة.


1] ادعى نسخة سابقة من هذه الإجابة بشكل غير صحيح clip.exe:
- يلحق دائمًا استراحة السطر عند النسخ إلى الحافظة (لا)
- يتعامل بشكل صحيح الملفات تم إعادة توجيهها إلى stdin عبر < مقابل عندما يتم إدخال الإدخال عبر | (clip.exe دائماً ينسخ bom إلى الحافظة ، أيضا).

أنا فقط تدوين كيفية القيام بذلك:

http://www.nivot.org/2009/10/14/powershell20gettingstingtextToAndFromTheClipboard.aspx

-oisin

يجب عليك التحقق من مضيفك أولاً. تقوم ISE بالفعل بتشغيل STA ، لذا ليست هناك حاجة إلى تدوير خيط آخر أو إيقاف تشغيل (وهو تحسين موجود في قائمة TODO الخاصة بي لـ PSCX). بالنسبة لمطالبة وحدة التحكم ، وهو MTA ، ثم سأصبح رمزًا ثنائيًا إما كما يعرض OISIN أو استخدام تطبيق C# بسيط بسيط مثل:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class OutClipboard {
  [STAThread]
  static void Main() {
    Clipboard.SetText(Console.In.ReadToEnd());
  }
}

وللحصول على محتويات الحافظة ، يكون Vista وبعد ذلك clip.exe.

لا أعتقد أنه حتى الوظائف المتقدمة من 2.0 جاهزة للسماح للناس بالاحتفال مع خيوط .NET الخاصة بهم في البرنامج النصي.

ألقِ نظرة على وصفة Lee Holme من كتاب طبخ PowerShell: set-clipboard. يمكنك استخدام As set-clipboard.ps1 ، أو مجرد إسقاط الكود داخل وظيفة PowerShell (هذا مثال من ملف التعريف الخاص بي PowerShell).

سيسمح لك البرنامج النصي بالحصول على إخراج الأنابيب الكامل إلى الحافظة ، على سبيل المثال:

dir | Set-Clipboard

علمت في الأصل حل لي هولمي من هذا الجواب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top