सवाल कमांड लाइन आउटपुट अपडेट करें, यानी प्रगति के लिए


मैं कमांड लाइन पर एक साधारण PHP स्क्रिप्ट में प्रगति मीटर दिखाने में सक्षम होना चाहता हूं। देखने के बजाय

Progress: 0%
Progress: 1%
etc...

मैं सिर्फ संख्या को बदलना चाहता हूं, और पिछले नंबर को प्रतिस्थापित करना चाहता हूं, उदाहरण के लिए गिट क्लोन की तरह Resolving deltas: 100% (8522/8522), done.

इस के लिए खोज करते समय मैंने पाया पर्ल में एक ही सवाल का जवाब दिया, जो सही है, लेकिन मुझे इसे PHP में नहीं मिला। क्या यह संभव है? यदि नहीं, तो मैं सी का सहारा लेगा।

धन्यवाद

अद्यतन करें: अगर कोई सी ++ संस्करण में रूचि रखता है, यह यहाँ है


44
2018-03-10 20:07


मूल


ब्राउज़र पर कुछ भी भेजा जाने से पहले आमतौर पर PHP ने अपना काम पूरा कर लिया है, स्क्रिप्ट क्या कर रही है?
@ डैगन वह कमांड लाइन का उपयोग कर रहा है - Pascal MARTIN
doh! धन्यवाद, यहां तक ​​कि गंध भी लगता है तो मेरे लिए एकमात्र PHP कमांड लाइन है जो मेरे लिए है, यह शायद ही कभी उपयुक्त है उपयोगकर्ता इंटरफेस।
हाँ, यह कमांड लाइन पर है। यह केवल व्यक्तिगत स्क्रिप्ट के लिए सरल स्क्रिप्ट के लिए है: प्रोजेक्ट वर्जन नंबर अपडेट करना, फ़ाइलों को कहीं स्थानांतरित करना आदि .. कुछ भी उपयोगकर्ता का सामना नहीं करना - Adam
वास्तविक पुरुषों को बहुत प्रगति सलाखों की आवश्यकता नहीं है :-)


जवाब:


इसका उपयोग करके किया जा सकता है एएनएसआई एस्केप अनुक्रम - यहाँ देखें एक सूची के लिए।

PHP में, आप इसका उपयोग करेंगे "\033" जब यह संकेत दिया जाता है ESC उस पृष्ठ पर।


आपके मामले में, आप इस तरह कुछ उपयोग कर सकते हैं:

echo "Progress :      ";  // 5 characters of padding at the end
for ($i=0 ; $i<=100 ; $i++) {
    echo "\033[5D";      // Move 5 characters backward
    echo str_pad($i, 3, ' ', STR_PAD_LEFT) . " %";    // Output is always 5 characters long
    sleep(1);           // wait for a while, so we see the animation
}


मैंने थोड़ा सा सरलीकृत किया, यह सुनिश्चित कर रहा हूं कि मेरे पास हमेशा 5 अतिरिक्त वर्ण हों, और हमेशा समान मात्रा में डेटा प्रदर्शित करें, हमेशा पीछे की संख्या से पीछे की ओर बढ़ें ...

लेकिन, ज़ाहिर है, यदि आवश्यक हो तो आपको अधिक जटिल करने में सक्षम होना चाहिए ;-)

और कई अन्य रोचक बचने के दृश्य हैं: उदाहरण के लिए, रंग आपके आउटपुट को थोड़ा बढ़ा सकते हैं ;-)


88
2018-03-10 20:19



सही लगता है। धन्यवाद - Adam
आपका स्वागत है :-) मजा करो! - Pascal MARTIN
PHP> 5.4.0 में अब ईएससी लिखने के लिए "\ e" है - Tobias Herkula
अच्छा .... लेकिन खिड़कियों पर भी काम नहीं करता है \e - Baba
विंडोज़ के लिए @ बाबा आप Ansicon ट्रे कर सकते हैं। github.com/adoxa/ansicon - Jens A. Koch


रिकॉर्ड के लिए सिर्फ पुराने धागे के लिए: कर्सर को वापस ले जाने के लिए फैंसी एएनएसआई एस्केप अनुक्रमण का उपयोग करने के बजाय मैं इसे अगली पंक्ति "\ n" की शुरुआत के बजाय "\ r" का उपयोग करके लाइन की शुरुआत में वापस ले जाता हूं। अपनी गूंज के बाद पहले कुछ भी ओवरराइट करने के बाद कुछ रिक्त स्थान जोड़ें, जैसे उदा। इसलिए:

for ($i=0 ; $i<=100 ; $i++) {
  echo "Progress: $i %   \r";
  sleep(1);
}

29
2017-11-13 09:31



विंडोज पर भी एक आकर्षण की तरह काम करता है! (परीक्षण किया) - Alex
सबसे ऊपर के साथ समाधान से अधिक आसान - ओएसएक्स पर पूरी तरह से काम करता है। - Antonio


इसके अलावा आप ऐसा कुछ भी कर सकते हैं:

<?php

function showTextBasedProgress()
{
   static $progress = '-';

   echo chr(8) . $progress; // chr(8) = \b

   switch ($progress)
   {
      case '-':
      {
         $progress = '\\';
         break;
      }

      case '\\':
      {
         $progress = '|';
         break;
      }

      case '|':
      {
         $progress = '/';
         break;
      }

      case '/':
      {
         $progress = '-';
         break;
      }
   }
}

उदाहरण का उपयोग:

while(1)
{
   showTextBasedProgress();
   sleep(1);
}

-2
2018-04-17 12:02