উত্তর:
এই লিপিটি আপনি যা বলেছেন ঠিক তেমনটাই করবে:
@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...
ডেভ বেনহ্যামের লেখা চার্লিব নামে একটি ব্যাচ স্ক্রিপ্টের চরিত্রের ম্যানিপুলেশন লাইব্রেরিতে কোডটি দেখে আমি এই উত্তরটি পেয়েছি ।
এই গ্রন্থাগারটি ১.২৫৫ পরিসরে সমস্ত অক্ষর তৈরি করতে সক্ষম।
আরও তথ্যের জন্য শিরোনামের শিরোনামটি দেখুন "একটি চরিত্রকে তার ASCII মানতে রূপান্তর করা কি সম্ভব?"
2017-4-26 সম্পাদনা করুন: দেখা যাচ্ছে যে উপরের কোডটি আর কাজ করে না । আমি নিশ্চিত না যে কখন এই আচরণটি পরিবর্তিত হত, তবে এটি অবশ্যই কাজ করবে। CR
পরে চরিত্র =
এখন দ্বারা ছিনতাই পরার set
হুকুম। আহ, এটি set
এক্সপি এবং উইন্ডোজের পরবর্তী সংস্করণগুলির মধ্যে যেভাবে কাজ করে তাতে পরিবর্তন দেখা যাচ্ছে । উইন্ডোজ ব্যাচ ফাইলে ওভাররাইট লাইনে চমৎকার উত্তরটি দেখুন ? (সদৃশ) আরও বিশদ এবং অতিরিক্ত কোড উদাহরণের জন্য।
তার পরে বিকল্পটি হ'ল শ্বেতস্পেস অক্ষর রাখার আগে !ASCII_13!
এবং এটি মুছে ফেলার ব্যবস্থা করা হয়, সম্ভবত একটি ব্যাকস্পেস (যা ছিঁড়ে না inুকিয়ে) সন্নিবেশ করে বা একটি স্পেস যুক্ত করে শেষের দিকে স্পেস যুক্ত করে by প্রম্পট স্ট্রিং (যা ফেলা হয় না।)
যেমন:
@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 যা ব্যাকস্পেসের সাথে করব। যেহেতু আমি এটি কীভাবে সিএমডি লিখতে জানি না, তাই আমি: EVALUATE ফাংশনটি ব্যবহার করি যা ভিবিএস সিআর () ফাংশনটি চালায় এবং ব্যাকস্পেস-চরিত্রটিকে ভেরিয়েবলের মধ্যে রাখে result
। যদি কেউ আরও ভাল উপায় জানেন তবে দয়া করে পরামর্শ দিন।
$host.ui.RawUI.CursorPosition
কোনও ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন এবং কার্সারটি যেখানে ছিলেন সেখানে ফিরে এসে আপনার আউটপুট ওভাররাইট করতে পুনরুদ্ধার করতে পারেন। পাওয়ারশেলের জন্য কেবলমাত্র একটি বিকল্প, তবে আপনার ভিবিএস স্টাফের চেয়ে কিছুটা পরিষ্কার হতে পারে :-)
@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
, কিন্তু আমি তাদের ব্যবহার সঙ্গে মাত্রাতিরিক্ত পরিচিত নই। উভয় গ্রন্থাগার ইউনিক্স সিস্টেমের জন্য তৈরি করা হয়েছিল, তবে আপনি সেগুলি উইন্ডোজের জন্য ( সাইগউইন পরিবেশে বা GnuWin32 ) খুঁজে পেতে পারেন।
ডস-স্টাইলে ব্যাচ ফাইলে এগুলি অ্যাক্সেসের কোনও সহজ উপায় আমি জানি না। আপনি সংকলিত ভাষায় প্রোগ্রামিংয়ের চেয়ে ভাল হতে পারেন। এটি কার্যকর হবে কিনা সে সম্পর্কে আরও ভাল ধারণা পেতে Ncurses HOWTO এ একবার দেখুন ।
সঙ্গে নোটপ্যাড ++, এটি সন্নিবেশ করতে সম্ভব Backspace ←, অক্ষর (হওয়া ASCII 0x08) সরাসরি তার ব্যবহার হওয়া ASCII কোড সন্নিবেশ প্যানেল (সম্পাদনা> ক্যারেক্টার প্যানেল)।
আমার সমাধানটি হ'ল [BS]
অক্ষরটি সরাসরি sertোকানো এবং তারপরে এখানে পোস্ট করা অন্যান্য সমাধানগুলির মতো পূর্ববর্তী অক্ষরগুলি মুছতে একাধিকবার ব্যবহার করুন:
কোড
@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
নোটপ্যাড ++ স্ক্রিনশট
আউটপুট
আর একটি সম্ভাবনা হ'ল ইউনিকোড অক্ষর (ইউ + 000 ডি) হিসাবে একটি সন্নিবেশ করানোর জন্য চেকো (রঙ সমর্থন সহ ইকো কমান্ড 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
এনবি: cecho_x64.exe
তুলনায় আমার মেশিনে দ্রুত গতিতে চলে cecho.exe
।