2008-11-01 19 views
14

Cố gắng viết một lệnh ghép ngắn PowerShell sẽ tắt âm thanh lúc khởi động, trừ khi đã tắt tiếng và tắt âm thanh ở cuối (chỉ khi nó không bị tắt tiếng để bắt đầu với). Không thể tìm thấy bất kỳ đối tượng PoweShell hoặc WMI nào tôi có thể sử dụng. Tôi đã được chơi với việc sử dụng các chức năng Win32 như auxGetVolume hoặc auxSetVolume, nhưng không thể làm cho nó hoạt động (làm thế nào để đọc các giá trị từ một IntPtr?).Làm cách nào để tắt/bật âm thanh của tôi khỏi PowerShell

Tôi đang sử dụng V2 CTP2. Bất kỳ ý tưởng folks?

Cảm ơn!

+0

Câu hỏi thú vị! –

+0

Bạn đã nhìn thấy câu hỏi này (nó được tính từ tiếng bíp, nhưng tôi không chắc bạn đang nói về âm thanh gì)? http://stackoverflow.com/questions/252799/turning-off-the-cmd-window-beep-sound – Ady

Trả lời

5

Có vẻ như không phải là cách nhanh chóng và dễ dàng để điều chỉnh âm lượng. Nếu bạn có kinh nghiệm C++, bạn có thể làm điều gì đó với this blog post, nơi Larry Osterman mô tả cách gọi giao diện IAudioEndpointVolume từ nền tảng api (cho Vista, XP có thể khó khăn hơn so với những gì tôi đã tìm thấy trong một vài tìm kiếm).

V2 cho phép bạn biên dịch mã nội tuyến (qua Loại bổ sung), do đó có thể là một tùy chọn.

5

Bạn có thể làm da mèo một cách khác bằng cách chỉ cần quản lý Dịch vụ âm thanh của Windows. Dừng nó để tắt tiếng, khởi động nó để bật tiếng.

+0

Đây là tùy chọn đơn giản nhất tôi tìm thấy trong tìm kiếm của mình hôm nay +1. "net stop" Windows Audio " – miltonb

+1

Trong powershell: Stop-Service -DisplayName" Windows Audio "& Start-Service -DisplayName" Windows Audio ".Tôi muốn tôi đã nghĩ về điều đó sớm hơn – Bewc

2

tôi không tìm thấy làm thế nào để làm điều này trong PowerShell, nhưng có một tiện ích dòng lệnh gọi NirCmd rằng sẽ làm các trick bằng cách chạy lệnh này:

C: \ utils \ nircmd.exe mutesysvolume 2

NirCmd có sẵn miễn phí ở đây: http://www.nirsoft.net/utils/nircmd.html

12

Sử dụng các lệnh sau đây trên một kịch bản PowerShell ps1:

$obj = new-object -com wscript.shell 
$obj.SendKeys([char]173) 
+0

Để chạy với .bat đặt mã này bên trong và ghi ** powershell.exe -file "C: \ file.ps1" ** –

2

Giải pháp trong vbscript:

Set WshShell = CreateObject("WScript.Shell") 
For i = 0 To 50 
    WshShell.SendKeys(chr(174)) 
    WScript.Sleep 100 
Next 

Phím giảm âm lượng 2 lần.

15

Bắt đầu với Vista, bạn phải sử dụng Core Audio API để điều khiển âm lượng hệ thống. Đó là một API COM không hỗ trợ tự động hóa và do đó đòi hỏi rất nhiều bản mẫu để sử dụng từ .NET và PowerShell.

Anyways mã Bellow cho phép bạn truy cập vào [Audio]::Volume[Audio]::Mute tính từ PowerShell. Điều này cũng làm việc trên một máy tính từ xa có thể hữu ích. Chỉ cần sao chép-dán mã trong cửa sổ PowerShell của bạn.

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)); } 
    } 
} 
'@ 

mẫu Cách sử dụng:

PS C:\> [Audio]::Volume   # Check current volume (now about 10%) 
0,09999999 
PS C:\> [Audio]::Mute   # See if speaker is muted 
False 
PS C:\> [Audio]::Mute = $true # Mute speaker 
PS C:\> [Audio]::Volume = 0.75 # Set volume to 75% 
PS C:\> [Audio]::Volume   # Check that the changes are applied 
0,75 
PS C:\> [Audio]::Mute 
True 
PS C:\> 

Có giấy gói NET toàn diện hơn trên mạng cho các API Core Audio nếu bạn cần một nhưng tôi không nhận thức được một tập hợp các cmdlet PowerShell thân thiện.

P.S.Diogo answer có vẻ thông minh nhưng không hiệu quả đối với tôi.

2

Tôi biết nó không phải là PowerShell, nhưng kết hợp các câu trả lời từ Michael và Diogo đưa ra một một dòng VBScript giải pháp:

CreateObject("WScript.Shell").SendKeys(chr(173)) 

Slap này trong mute.vbs và bạn có thể chỉ cần nhấp đúp để chuyển đổi tắt tiếng

  • vẫn còn wor ks trong Windows 10 (10586.104)
  • không cần phải Set-ExecutionPolicy như bạn có thể với PowerShell
4

câu trả lời Alexandre của phù hợp với hoàn cảnh của tôi, nhưng gương sáng của mình không hoạt động do lỗi biên dịch liên quan đến không gian tên của 'var'. Có vẻ như các phiên bản mới hơn/khác nhau của .net có thể khiến ví dụ không hoạt động. Nếu bạn thấy rằng bạn nhận được lỗi biên dịch, đây là một phiên bản thay thế cho thử đối với những trường hợp:

Add-Type -Language CsharpVersion3 -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)); } 
    } 
} 
'@ 

Cách sử dụng là như nhau:

PS C:\> [Audio]::Volume   # Check current volume (now about 10%) 
0,09999999 
PS C:\> [Audio]::Mute   # See if speaker is muted 
False 
PS C:\> [Audio]::Mute = $true # Mute speaker 
PS C:\> [Audio]::Volume = 0.75 # Set volume to 75% 
PS C:\> [Audio]::Volume   # Check that the changes are applied 
0,75 
PS C:\> [Audio]::Mute 
True 
PS C:\> 
Các vấn đề liên quan