2010-07-14 15 views
9

कंसोल एप्लिकेशन के साथ काम करते समय, Console.ReadLine() पर दर्ज की गई सभी चीज़ों का इतिहास संग्रहीत किया जाता है। कंसोल प्रॉम्प्ट पर कुछ दर्ज करने के लिए, ऊपर/नीचे कर्सर दबाकर इस इतिहास के माध्यम से स्क्रॉल होगा (और पूरा इतिहास F7 दबाकर देखा जा सकता है)।कंसोल इतिहास को प्रोग्रामेटिक रूप से साफ़ करना संभव है?

सी # का उपयोग करना, क्या इस व्यवहार को अक्षम करने या पहले से ही दर्ज किए गए इतिहास को साफ़ करने का कोई तरीका है?


स्पष्ट करने के लिए, Console.Clear() इतिहास, केवल स्क्रीन बफर स्पष्ट नहीं है। मैं कमांड इतिहास को साफ़ करना चाहता हूं।


संपादित करें: सुझाव दिया तरीकों में से कई, साथ ही मेरी खुद के तैयार करने के कुछ के रूप में करने की कोशिश की है, सबसे अच्छा तरीका ho1 ने सुझाव दिया है। यह आदर्श नहीं है क्योंकि यह एक और कंसोल विंडो लाता है, लेकिन यह इतिहास को साफ़ करता है।

उत्तर

1

संपादित करें: निकाला गलत जवाब और एक अन्य (उम्मीद) बेहतर जवाब जोड़ा (मैं आपको बस इतना करना क्या चाहता था के बारे में उलझन मिला)।

FreeConsole का उपयोग कर वर्तमान कंसोल को मुक्त करके और AllocConsole का उपयोग करके एक नया कंसोल आवंटित करके ऐसा करना संभव हो सकता है। मुझे लगता है कि यह कमांड लाइन इतिहास तब नहीं रखेगा। Console Functions

+0

इतिहास से कुछ भी नहीं करता है मुझे डर है। – adrianbanks

+0

@adrianbanks: हाँ, आप जो कर रहे थे उसके बारे में भ्रमित हो गए (हालांकि कम से कम मैंने इस प्रश्न के अन्य उत्तरों की तुलना में एक अलग गलती की है :))। मैंने अपने उत्तर को एक और संभावित समाधान के साथ अद्यतन किया है। –

4

इस पोस्ट को How can I configure the command line history, DOSKEY? पर सहायता मिल सकती है?

पुराने डीओएस दिनों में एक उपयोगिता उपलब्ध थी, DOSKEY.EXE, जिसने उपयोगकर्ता को पिछले आदेशों के माध्यम से चक्र करने में सक्षम बनाया। एनटी में यह डिफ़ॉल्ट रूप से सक्षम है और आप पुरानी कमांड के माध्यम से चक्र कर सकते हैं हालांकि डॉस्की की अन्य क्षमताएं हैं।

वर्तमान कमांड लाइन इतिहास उपयोग आदेश हटाने के लिए:

doskey /reinstall 

या फिर आप यह बता सकते हैं कि कितने पुराने आदेशों/listsize पैरामीटर

doskey /reinstall /listsize=50 

साथ रखने के लिए 50 वर्ष आदेशों रहेंगे ।

कृपया

+0

एक्सपी एसपी 3 पर काम करता है। – mavnn

+0

मैं अपने स्वयं के कंसोल एप्लिकेशन के भीतर से प्रोग्रामेटिक रूप से ऐसा करना चाहता हूं, इसलिए मैं बाहरी उपकरण का उपयोग करने पर भरोसा नहीं करना चाहता हूं। – adrianbanks

+1

क्या होगा यदि आप जिस कार्यक्षमता को दबा रहे हैं वह उसी टूल द्वारा प्रदान की जाती है? –

0

ऐसा लगता है एमएसएन के अनुसार (http://msdn.microsoft.com/en-ie/library/system.console_members.aspx) विधि console.clear() "सांत्वना बफर साफ़ करता है .." संपत्ति का उपयोग कर

Console.BufferHeight : "This property defines the number of rows (or lines) stored in the buffer that is accessed by a console mode window" 
+0

वह कमांड इतिहास को साफ़ करना चाहता है, कंसोल बफर नहीं (अगर मैं सही ढंग से समझ गया) – Svish

+0

ठीक है .. मैंने सोचा कि बफर और इतिहास बाध्य था। – bAN

0

आप की कोशिश कर सकते मुझे पता है अगर यह काम करता है और आप कैसे इस्तेमाल किया यह :)

+0

मैंने पहले से ही कोशिश की है, लेकिन यह मुझे शून्य का मान निर्धारित करने नहीं देगा। – adrianbanks

+0

बफरहेइट सभी कंसोल आउटपुट की स्क्रोल करने योग्य विंडो है। यही कारण है कि बफरविड्थ भी है। –

1

SetConsoleHistoryInfo पर एक नज़र डालें:

सामान्य में, अगर आप कंसोल कि नेट फ्रेमवर्क द्वारा समर्थित नहीं है के साथ काम करने के लिए चाहते हैं, यह MSDN पेज एक अच्छी जगह देखने के लिए है। दस्तावेज़ीकरण के मुताबिक यह केवल Vista और ऊपर काम करता है, इसलिए मुझे यकीन नहीं है कि यह आपकी मदद करेगा या नहीं।

1

यह कोड आदेश इतिहास को साफ़ करने के लिए मेरे लिए काम कर रहा है। सीमित परीक्षण और पोर्टेबिलिटी पर कोई गारंटी नहीं है।

public static partial class ConsoleEx 
{ 
    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool SetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool GetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

    [StructLayout(LayoutKind.Sequential)] 
    private class CONSOLE_HISTORY_INFO 
    { 
     public uint cbSize; 
     public uint BufferSize; 
     public uint BufferCount; 
     public uint TrimDuplicates; 
    } 

    public static void ClearConsoleHistory() 
    { 
     var chi = new CONSOLE_HISTORY_INFO(); 
     chi.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(CONSOLE_HISTORY_INFO)); 

     if (!GetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 

     var originalBufferSize = chi.BufferSize; 
     chi.BufferSize = 0; 

     if (!SetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 

     chi.BufferSize = originalBufferSize; 

     if (!SetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 
    } 
} 
+0

अवधारणा उदाहरण की पठनीयता में सुधार करने के लिए हटाए गए त्रुटि को हटाकर रिटर्न के साथ प्रतिस्थापित किया गया। –

+0

यह सही उत्तर होना चाहिए। यह सी # .NET प्रबंधित कोड है जो आपको आवश्यकतानुसार Win32 कॉल को लपेटता है। Win32 कंसोल कार्यक्षमता प्रोग्रामेटिक रूप से पहुंचने के लिए इस तरह का रैपर कोड आवश्यक है, जैसे कि ईओएल रैप टॉगलिंग, स्क्रीन पर कंसोल को केंद्रित करना, विंडो अपडेट लॉक करना आदि। – delrocco

संबंधित मुद्दे