बैच फ़ाइल से कमांड आउटपुट में एक ही लाइन को ओवरराइट कैसे करें


13

मैं कुछ स्टेटस की जानकारी लिखना चाहता हूं, जब मैं कुछ करता हूं तो आखिरी लाइन को बदल देता हूं।

निम्न उदाहरण बैट फाइल में, मैं चाहता हूं कि टेक्स्ट कमांड आउटपुट में एक ही लाइन पर Step 2ओवरराइट करे Step 1

echo off

echo Step 1
REM Do some stuff...

echo Step 2
REM do some other stuff...

जवाबों:


8

यह स्क्रिप्ट वही करेगी जो आपने पूछा था:

@echo off

setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"

set /p "=Step 1" <NUL
REM Do some stuff...

set /p "=!ASCII_13!Step 2" <NUL
REM do some other stuff...

मुझे यह उत्तर चार्ली लिपि द्वारा चार्लीब नामक एक बैच लिपि चरित्र हेरफेर लाइब्रेरी में कोड को देखकर मिला

यह लायब्रेरी 1..255 में सभी वर्ण बनाने में सक्षम है।

अधिक जानकारी के लिए थ्रेड को "क्या ASCII मान के लिए वर्ण बदलना संभव है?"

2017-4-26 संपादित करें: ऐसा प्रतीत होता है कि ऊपर दिया गया कोड अब काम नहीं करता है । मैं अनिश्चित हूं जब यह व्यवहार बदल गया होगा, लेकिन यह निश्चित रूप से काम करता था। अब के CRबाद का चरित्र कमान =द्वारा छीन लिया जाता है set। आह, यह setWindows के XP और बाद के संस्करणों के बीच काम करने के तरीके में बदलाव प्रतीत होता है । विंडोज बैच फ़ाइल में ओवरराइट लाइन में उत्कृष्ट उत्तर देखें ? (डुप्लिकेट) अधिक विवरण और अतिरिक्त कोड उदाहरण के लिए।

इसके बाद एक विकल्प यह है कि एक गैर-व्हाट्सएप चरित्र को पहले रखा जाए !ASCII_13!और उसे भी मिटा दिया जाए, शायद या तो एक बैकस्पेस (जो छीन न जाए) के साथ एक स्थान या उसके बाद रिक्त स्थान को जोड़कर। शीघ्र स्ट्रिंग (जो छीन नहीं है।)

इस तरह:

@echo off

setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"

set /p "=Step 1" <NUL
REM Do some stuff...

set /p "=x!ASCII_13!Step 2 " <NUL
REM do some other stuff...

2
मेरे लिए, यह स्क्रीन पर सिर्फ "चरण 2" होने के बजाय "स्टेप 1 स्टेप 2" प्रिंट करता है।
गैलमोक

@galmok मेरे साथ भी ऐसा होने लगा है, लेकिन मुझे यकीन है कि इसका इस्तेमाल कभी नहीं किया गया है (जैसा कि मेरे पास एक स्क्रिप्ट है जो हाल ही में आपके द्वारा बताए गए व्यवहार में पूरी तरह से काम करने के लिए इस्तेमाल की गई है।) ऐसा प्रतीत होता है कि setकमांड अब किसी को भी स्ट्रिप्स करता है। सीआर और एलएफ अक्षर (साथ ही रिक्त स्थान) के बाद =। के बीच एक गैर- =!ACSII_13!
व्हाट्सएप

यह सब करने का एक तरीका है ... मैं वास्तव में यह देखने के लिए आया था कि क्या किसी और ने ध्यान दिया है, क्योंकि मैं यह देखना चाहता था कि क्या उन्होंने पता लगाया था कि यह कितनी दूर चला गया है। ... क्या मैं स्टैक ओवरफ्लो पर एक उत्तर लिख सकता हूं? या .. एक प्रश्न की तरह और तुरंत इसका उत्तर दें? मुझे लगता है कि मैं इसे प्रश्न रूप में लिख सकता हूं कि आप इसके साथ क्या कर सकते हैं .. मुझे कुछ खाने के लिए मिला है, लेकिन मैं इसे आपके लिए एक लिंक के साथ अपडेट करूंगा।
ब्रेंट रिटेनहाउस

लिखें! ASCII_13! स्टेप 1 के बाद स्ट्रिपिंग को रोकने के लिए, इसलिए स्टेप 2 में आप कोड करेंगे:set /p "=Step 2 " <NUL
जोम्बा

6

प्रश्न का उत्तर देने के लिए:

@echo off
CALL :EVALUATE "chr(8)"
SET backspace=%result%
<nul set /p =Step 1
:: DO SOME STUFF....
<nul set /p =%backspace%
<nul set /p =2
:: DO SOME OTHER STUFF....
<nul set /p =%backspace%%backspace%%backspace%%backspace%%backspace%%backspace%
<nul set /p =End   
GOTO:EOF



:EVALUATE           -- evaluate with VBS and return to result variable
::                  -- %~1: VBS string to evaluate
:: extra info: http://groups.google.com/group/alt.msdos.batch.nt/browse_thread/thread/9092aad97cd0f917

@IF [%1]==[] ECHO Input argument missing & GOTO :EOF 

@ECHO wsh.echo "result="^&eval("%~1") > %temp%\evaluate_tmp_67354.vbs 
@FOR /f "delims=" %%a IN ('cscript //nologo %temp%\evaluate_tmp_67354.vbs') do @SET "%%a" 
@DEL %temp%\evaluate_tmp_67354.vbs
::ECHO %result%
@GOTO:EOF

आउटपुट:

End

मूल रूप से, स्क्रिप्ट क्या करती है, लिखी जाती है, Step 1फिर एक जगह वापस जाती है, ओवरराइट करती है 1, और अंत में पूरी तरह से वापस आ जाती है और इसके Step 2साथ ओवरराइट हो जाती है End

यह वापस मैं विशेष ASCII चरित्र 8 के साथ करता हूं जो बैकस्पेस है। क्योंकि मुझे नहीं पता कि इसे cmd में कैसे लिखना है, इसलिए मैं इसका उपयोग करता हूं: EVALUATE फ़ंक्शन का उपयोग करता है जो VBS Chr () फ़ंक्शन चलाता है, और बैकस्पेस-वर्ण को चर में डालता है result। यदि कोई बेहतर तरीका जानता है, तो कृपया सलाह दें।


1
PowerShell में, आप $host.ui.RawUI.CursorPositionएक चर में भी स्टोर कर सकते हैं और इसे बाद में पुनर्स्थापित कर सकते हैं ताकि कर्सर वापस उसी जगह पर हो जहां आप थे और अपने आउटपुट को ओवरराइट कर दें। केवल PowerShell के लिए एक विकल्प है, लेकिन आपके VBS सामान की तुलना में थोड़ा साफ हो सकता है :-)
मिही

4
@echo off
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
<nul set /p =Step 1
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%
<nul set /p =2
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%
<nul set /p =3
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%%BSPACE%%BSPACE%%BSPACE%%BSPACE%%BSPACE%
<nul set /p =End.  
pause

व्याख्या:

for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"

यह बैकस्पेस वर्ण को BSPACE चर में सेट करेगा। अब परिणाम देखने के लिए, टाइप करें:

echo ab%BSPACE%c

उत्पादन: ac

आप कई वर्णों को हटाने के लिए एक से अधिक बार इस BSPACE चर का उपयोग कर सकते हैं।

अब, यदि आप एक चर में एक गाड़ी वापसी सेट करना चाहते हैं, तो उपयोग करें

for /F "usebackq" %%a in (कॉपी / जेड "% ~ dpf0" nul) DO (set "cr=%%a")

परिणाम देखने के लिए, टाइप करें: setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***

उत्पादन होगा: ***asfasdhlfashflkashflksa

@ ऊपर डावर का जवाब भी सुंदर है लेकिन @ टाइमफोडेन का जवाब मेरे काम नहीं आया।


@ टाइमफोडेन का जवाब काम नहीं आया क्योंकि! पिछले चरण के अंत में जाना चाहिए। इसके अलावा, उन सभी% BSPACE% s के बजाय, आप भी कर सकते हैं! CR! : और व्हाइटस्पेस से भरनाset /p "=.!CR!End. " <NUL&echo:
Zimba

3

आप नहीं कर सकते। आमतौर पर आप फ़ाइल में एक गाड़ी-वापसी चरित्र (0x0D) को शामिल करके इस तरह की चीज प्राप्त कर सकते हैं जो कर्सर को उसी पंक्ति में पहले कॉलम में वापस डाल देगा। लेकिन इस मामले में यह काम नहीं करता है; सीआर बस चुपचाप खाया जाता है।

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

#include <stdio.h>

int main(int argc, char* argv[]) {
  if (argc < 2) return 1;
  printf("\r%s", argv[1]);
}

यह एक सीआर चरित्र को मुद्रित करने और फिर आपके द्वारा पहले तर्क के रूप में निर्दिष्ट पाठ से ज्यादा कुछ नहीं करता है। उपयोग निम्नानुसार है:

@echo off
<nul set /P X=Step 1
pause>nul 2>nul
over.exe "Step 2"

अंतिम पंक्ति उस प्रोग्राम की कॉल है। दूसरी पंक्ति एक अनुगामी रेखा विराम के बिना मुद्रण पाठ के लिए सामान्य बैच मुहावरे है (जो इस मामले में महत्वपूर्ण है क्योंकि अन्यथा आप पंक्ति को अधिलेखित नहीं कर सकते)। आप बस के रूप में अच्छी तरह से उस जगह में ऊपर कार्यक्रम का उपयोग कर सकते हैं, हालांकि।

एक हल्के ढंग से हैक करने का तरीका, लेकिन केवल एक ही जहाँ आप सुनिश्चित कर सकते हैं कि आप कहाँ समाप्त होते हैं, clsअपने कदम आउटपुट से पहले उपयोग करना होगा । झिलमिलाहट होगी लेकिन इस तरह आप हमेशा ऊपरी-बाएँ लिखते हैं। और वह सब कुछ जो सांत्वना में दिखाई दे रहा था (जो कि मैं इसकी सिफारिश नहीं करूँगा) क्यों नहीं; अधिकांश उपयोगकर्ताओं को यह बहुत पसंद नहीं है।


ठीक है, मुझे संदेह था कि स्वच्छ कमांड लाइन के साथ ऐसा करना संभव नहीं था। अगर मैं एक उपयोगिता बनाना चाहता हूं तो यह करो, मैं पूरी चीज को एक उपयोगिता में रख सकता हूं। जो मैं वास्तव में चाहता था, वह केवल एक दृश्य उलटी गिनती थी जो 5 सेकंड तक प्रतीक्षा करती थी, प्रत्येक सेकंड को समाप्त होने तक गिनती थी।
विस्मयकारी

4
विस्मय: यदि आप विस्टा पर हैं या बाद में, तो timeout 5काम करेंगे।
जॉय

महान! धन्यवाद! टाइमआउट 5 काम करता है!
विस्मय में

4
मुझे अपना असली मुद्दा पहली बार पोस्ट करना चाहिए था ...
awe

निःसंदेह तुमसे हो सकता है; बस चरण 1 के बाद गाड़ी वापसी जोड़ें! इसके अलावा, यहाँ पाठ संपादक को शामिल किए बिना कैरिज रिटर्न पाने के लिए कुछ कोड हैं:for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
जोम्बा

1

न्यू लाइन चरित्र जाओ, अगले कदम के बारे में, लाइन के शुरू करने के लिए वापस जाने के लिए, अगली पंक्ति लिखें:

@echo off
cls
setlocal enabledelayedexpansion
echo Here's how it's done:

for /f %%a in ('copy /Z "%~f0" nul') do set "Newline=%%a"
set /p "=Step 1!Newline!" <NUL
REM Do some stuff...
ping -n 2 localhost > nul
set /p "=Step 2!Newline!" <NUL
ping -n 2 localhost > nul
set /p "=Step 3 " <NUL
REM do some other stuff...
ping -n 2 localhost > nul
echo:
echo Done.

यह केवल तभी काम करेगा जब Step 1 Step 2 Step 3सभी समान लंबाई के हों। पहले का पाठ नहीं तो set /pबनी हुई है। निश्चित नहीं है कि इसे कैसे ठीक किया जाए।
Ste

यही कारण है कि समस्या अगले प्रॉम्प्ट में अतिरिक्त खाली स्थान के अक्षरों का उपयोग द्वारा निर्धारित किया जा सकता है। किसी भी पिछले वर्णों को कवर करने के लिए। विरोध के रूप में उदाहरण । चरित्र के लिए विनिमय । set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NULset /p "=Step 2!Newline!" <NULSPACE
Ste

यदि पिछली लाइनें अधिक लंबी हैं, तो अतिरिक्त वर्णों को खाली करने के लिए रिक्त स्थान जोड़ें, या पंक्ति के अंत से शुरुआत तक, या अतिरिक्त वर्णों के लिए बैकस्पेस जोड़ें।
जोम्बा

0

आपको एक स्क्रीन-कर्सर लाइब्रेरी की आवश्यकता होगी जैसे cursesया ncurses, लेकिन मैं उनके उपयोग से अत्यधिक परिचित नहीं हूं। दोनों पुस्तकालयों को यूनिक्स प्रणालियों के लिए विकसित किया गया था, लेकिन आप उन्हें विंडोज के लिए ( सिग्विन पर्यावरण में , या ग्नूविन 32 में पा सकते हैं )।

मुझे DOS- स्टाइल बैच फ़ाइल में उन्हें एक्सेस करने का कोई आसान तरीका नहीं पता है। आप संकलित भाषा में प्रोग्रामिंग से बेहतर हो सकते हैं। Ncurses HOWTO पर एक नज़र डालें कि क्या यह उपयोगी होगा।


शाप केवल टर्मिनल और टर्मिनल एमुलेटर के लिए बहुत ज्यादा हैं। वे वास्तव में विंडोज के मूल कंसोल एपीआई पर मैप नहीं करते हैं।
जॉय

बाहरी पुस्तकालयों के लिए कोई ज़रूरत नहीं; सीएमडी उपकरण के साथ ठीक काम करता है।
Zimba

0

समाधान 1

नोटपैड ++ के साथ Backspace ←, अपने ASCII कोड्स इंसर्शन पैनल (एडिट> कैरेक्टर पैनल) का उपयोग करके सीधे चरित्र (ASCII 0x08) डालना संभव है ।

मेरा समाधान [BS]चरित्र को सीधे सम्मिलित करना है और फिर, यहां पोस्ट किए गए अन्य समाधानों की तरह, पिछले वर्णों को हटाने के लिए इसे कई बार उपयोग करें:

कोड

@ECHO OFF

SET "BACKSPACE_x7=[BS][BS][BS][BS][BS][BS][BS]"

SET /P "DUMMY_VAR=Step 1" < NUL
REM Do some stuff...

SET /P "DUMMY_VAR=%BACKSPACE_x7%Step 2" < NUL
REM Do some other stuff...

GOTO :EOF

नोटपैड ++ स्क्रीनशॉट

विंडोज बैच अधिलेखित


उत्पादन

सीएमडी उत्पादन


समाधान २

एक और संभावना है कि यूनिकोड वर्ण (U + 000D) के रूप में सम्मिलित करने के लिए cecho (रंगों के समर्थन के साथ इको कमांड Carriage Return ↵) का उपयोग करें:

कोड

@ECHO OFF

SET CARRIAGE_RETURN={\u000D}

cecho Step 1
REM Do some stuff...

cecho %CARRIAGE_RETURN%Step 2
REM Do some other stuff...

GOTO :EOF

NB: की cecho_x64.exeतुलना में मेरी मशीन पर काफी तेजी से चलता है cecho.exe

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.