يمكن لـ Windows 10 الاحتفاظ بملفات تعريف صوت منفصلة لأجهزة الصوت المختلفة، لكل جهاز صوتي تقوم بالاتصال به، يمكنك ضبط مستوى صوت مختلف وعندما يكون الجهاز متصلاً، سيتم ضبط مستوى الصوت تلقائيًا. بطبيعة الحال، لا أحد يبقي جهاز الصوت مكتومًا طوال الوقت. إذا كنت تستخدم زوجًا من سماعات الرأس مع سطح المكتب، وغالبًا ما تضطر إلى قطع الاتصال بينهما، فيمكنك استخدام برنامج PowerShell النصي الصغير الذي سيؤدي تلقائيًا إلى كتم الصوت عند فصل سماعات الرأس.
هذا شيء تفعله الهواتف المحمولة، على سبيل المثال، عندما تقوم بفصل سماعات الرأس، تتوقف الموسيقى تلقائيًا. يتمثل المنطق وراء ذلك في أنك إما انتهيت من الاستماع إلى الموسيقى أو أزلت سماعات الرأس عن طريق الخطأ وكنت بحاجة إلى طريقة سريعة لإيقاف تشغيلها، تم كتابة السكربت بشكل أساسي على هذا المبدأ نفسه، افتح المفكرة وقم بلصق السكربت التالي :
انشئ ملف نصي "txt" جديد، قم بلصق السكربت بداخله :
اذهب إلى ملف حفظ بأسم قم بتسمية الملف، اضغط على حفظ كنوع وحدد "All Files"، احفظه في مكان ما من غير المحتمل أن تحذفه فيه عن طريق الصدفة ولكن أيضًا حيث يمكنك العثور عليه بسهولة إذا كنت بحاجة إليه، بعد ذلك قم بتغير لاحقة الملف من txt الى PS1 واضغط انتر، سينتج ملف بهذا الشكل :
إن قمت بالضغط على الملف الآن فسيتم فتحه بالمفكرة، لا يمكن لـ PowerShell تشغيل برنامج نصي تلقائيًا، هناك إجراء أمني مدمج يمنعه من القيام بذلك، الحل بسيط، يمكنك استخدام برنامج نصي دفعي لتشغيل البرامج النصية PowerShell تلقائيًا. الآن تابع معنا طريقة إنشاء برنامج نصي دفعي لتشغيل البرامج النصية ل PowerShell تلقائياً في ويندوز 10.
السكربت يكون على الشكل التالي :
هذا شيء تفعله الهواتف المحمولة، على سبيل المثال، عندما تقوم بفصل سماعات الرأس، تتوقف الموسيقى تلقائيًا. يتمثل المنطق وراء ذلك في أنك إما انتهيت من الاستماع إلى الموسيقى أو أزلت سماعات الرأس عن طريق الخطأ وكنت بحاجة إلى طريقة سريعة لإيقاف تشغيلها، تم كتابة السكربت بشكل أساسي على هذا المبدأ نفسه، افتح المفكرة وقم بلصق السكربت التالي :
[cmdletbinding()] Param() #Adding definitions for accessing the Audio API Add-Type -TypeDefinition @' using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ... are unused COM method slots. Define these if you care int f(); int g(); int h(); int i(); int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext); int j(); int GetMasterVolumeLevelScalar(out float pfLevel); int k(); int l(); int m(); int n(); int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext); int GetMute(out bool pbMute); } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDevice { int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev); } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDeviceEnumerator { int f(); // Unused int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint); } [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { } public class Audio { static IAudioEndpointVolume Vol() { var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator; IMMDevice dev = null; Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev)); IAudioEndpointVolume epv = null; var epvid = typeof(IAudioEndpointVolume).GUID; Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv)); return epv; } public static float Volume { get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;} set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));} } public static bool Mute { get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; } set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } } } '@ -Verbose While($true) { #Clean all events in the current session since its in a infinite loop, to make a fresh start when loop begins Get-Event | Remove-Event -ErrorAction SilentlyContinue #Registering the Event and Waiting for event to be triggered Register-WmiEvent -Class Win32_DeviceChangeEvent Wait-Event -OutVariable Event |Out-Null $EventType = $Event.sourceargs.newevent | ` Sort-Object TIME_CREATED -Descending | ` Select-Object EventType -ExpandProperty EventType -First 1 #Conditional logic to handle, When to Mute/unMute the machine using Audio API If($EventType -eq 3) { [Audio]::Mute = $true Write-Verbose "Muted [$((Get-Date).tostring())]" } elseif($EventType -eq 2 -and [Audio]::Mute -eq $true) { [Audio]::Mute = $false Write-Verbose "UnMuted [$((Get-Date).tostring())]" } }
انشئ ملف نصي "txt" جديد، قم بلصق السكربت بداخله :
اذهب إلى ملف حفظ بأسم قم بتسمية الملف، اضغط على حفظ كنوع وحدد "All Files"، احفظه في مكان ما من غير المحتمل أن تحذفه فيه عن طريق الصدفة ولكن أيضًا حيث يمكنك العثور عليه بسهولة إذا كنت بحاجة إليه، بعد ذلك قم بتغير لاحقة الملف من txt الى PS1 واضغط انتر، سينتج ملف بهذا الشكل :
السكربت يكون على الشكل التالي :
@ECHO OFF PowerShell.exe -Command "Path to script"
استبدل عبارة "Path to script" بالمسار الفعلي للبرنامج النصي PowerShell الذي قمنا بأنشائه قبل قليل، خذ بعين الاعتبار المثال التالي :
@ECHO OFF PowerShell.exe -Command "C:\Reminder-Scripts\Milk\Buy-Milk.ps1"
افتح المفكرة وقم بلصق البرنامج النصي فيه :
احفظ الملف بامتداد "bat"، ما تفعله هذه الملفات الدفعية هو أنها تفتح PowerShell ثم تشغل النص البرمجي الذي أشرت إليه، سينتج أيضاً ملف بهذا الشكل :
احفظ الملف بامتداد "bat"، ما تفعله هذه الملفات الدفعية هو أنها تفتح PowerShell ثم تشغل النص البرمجي الذي أشرت إليه، سينتج أيضاً ملف بهذا الشكل :
هكذا نكون قد تحصلنا في النهاية على برنامج نصي دفعي ليشغل البرنامج النصي لل PowerShell الذي قمنا بأعداده في البداية لكتم الصوت تلقائياً في ويندوز 10 عندما تكون سماعات الرأس غير موصولة.