जवाबों:
यह स्क्रिप्ट वही करेगी जो आपने पूछा था:
@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
। आह, यह set
Windows के 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...
set
कमांड अब किसी को भी स्ट्रिप्स करता है। सीआर और एलएफ अक्षर (साथ ही रिक्त स्थान) के बाद =
। के बीच एक गैर- =
!ACSII_13!
set /p "=Step 2 " <NUL
प्रश्न का उत्तर देने के लिए:
@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
। यदि कोई बेहतर तरीका जानता है, तो कृपया सलाह दें।
$host.ui.RawUI.CursorPosition
एक चर में भी स्टोर कर सकते हैं और इसे बाद में पुनर्स्थापित कर सकते हैं ताकि कर्सर वापस उसी जगह पर हो जहां आप थे और अपने आउटपुट को ओवरराइट कर दें। केवल PowerShell के लिए एक विकल्प है, लेकिन आपके VBS सामान की तुलना में थोड़ा साफ हो सकता है :-)
@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
@ ऊपर डावर का जवाब भी सुंदर है लेकिन @ टाइमफोडेन का जवाब मेरे काम नहीं आया।
set /p "=.!CR!End. " <NUL&echo:
आप नहीं कर सकते। आमतौर पर आप फ़ाइल में एक गाड़ी-वापसी चरित्र (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
अपने कदम आउटपुट से पहले उपयोग करना होगा । झिलमिलाहट होगी लेकिन इस तरह आप हमेशा ऊपरी-बाएँ लिखते हैं। और वह सब कुछ जो सांत्वना में दिखाई दे रहा था (जो कि मैं इसकी सिफारिश नहीं करूँगा) क्यों नहीं; अधिकांश उपयोगकर्ताओं को यह बहुत पसंद नहीं है।
timeout 5
काम करेंगे।
for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
न्यू लाइन चरित्र जाओ, अगले कदम के बारे में, लाइन के शुरू करने के लिए वापस जाने के लिए, अगली पंक्ति लिखें:
@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
बनी हुई है। निश्चित नहीं है कि इसे कैसे ठीक किया जाए।
set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
set /p "=Step 2!Newline!" <NUL
SPACE
आपको एक स्क्रीन-कर्सर लाइब्रेरी की आवश्यकता होगी जैसे curses
या ncurses
, लेकिन मैं उनके उपयोग से अत्यधिक परिचित नहीं हूं। दोनों पुस्तकालयों को यूनिक्स प्रणालियों के लिए विकसित किया गया था, लेकिन आप उन्हें विंडोज के लिए ( सिग्विन पर्यावरण में , या ग्नूविन 32 में पा सकते हैं )।
मुझे DOS- स्टाइल बैच फ़ाइल में उन्हें एक्सेस करने का कोई आसान तरीका नहीं पता है। आप संकलित भाषा में प्रोग्रामिंग से बेहतर हो सकते हैं। Ncurses HOWTO पर एक नज़र डालें कि क्या यह उपयोगी होगा।
नोटपैड ++ के साथ 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
।