ব্যাচ ফাইল থেকে কমান্ড আউটপুটে একই লাইনটি কীভাবে ওভাররাইট করা যায়


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...

ডেভ বেনহ্যামের লেখা চার্লিব নামে একটি ব্যাচ স্ক্রিপ্টের চরিত্রের ম্যানিপুলেশন লাইব্রেরিতে কোডটি দেখে আমি এই উত্তরটি পেয়েছি

এই গ্রন্থাগারটি ১.২৫৫ পরিসরে সমস্ত অক্ষর তৈরি করতে সক্ষম।

আরও তথ্যের জন্য শিরোনামের শিরোনামটি দেখুন "একটি চরিত্রকে তার 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...

2
আমার জন্য, এটি স্ক্রিনে কেবল "পদক্ষেপ 2" না রেখে কেবল "পদক্ষেপ 1 স্টেপ 2" মুদ্রণ করে।
গ্যালামোক

@galmok এটি আমার সাথেও ঘটতে শুরু করেছে, তবে আমি নিশ্চিত যে এটি কখনই ব্যবহৃত হত না (যেমন আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা পুরোপুরি পুরোপুরিভাবে কাজ করার জন্য ব্যবহৃত হয়েছিল আপনার বর্ণনার আচরণে পরিবর্তিত হয়েছে।) এটি প্রদর্শিত হয় যে setকমান্ডটি এখন কোনও স্ট্রিপ সরিয়ে দেয় সিআর এবং এলএফ অক্ষর (পাশাপাশি স্পেসস) এর পরে ==!ACSII_13!
টাইমফডেন

এই সমস্ত কিছু করার একটি উপায় আছে ... আমি আসলে অন্য কারও নজরে পড়েছে কিনা তা দেখার জন্য এসেছি, কারণ আমি দেখতে চেয়েছিলাম তারা এটি কতদূর এগিয়ে গেছে তা আবিষ্কার করতে পেরেছিল কিনা। ... স্ট্যাক ওভারফ্লোতে আমি কী উত্তর লিখতে পারি? বা .. একটি প্রশ্নের মত এবং অবিলম্বে এটি উত্তর? আমি মনে করি আপনি এটি দিয়ে কী করতে পারেন তা নিয়ে আমি প্রশ্ন আকারে এটি লিখতে পারি .. আমার কিছু খেতে যেতে হবে তবে আমি আপনার জন্য একটি লিঙ্ক দিয়ে এটি আপডেট করব।
ব্রেন্ট রাইটেনহাউস

লিখুন! ASCII_13! স্ট্রিপিং প্রতিরোধের জন্য পদক্ষেপ 1 এর পরে, তাই দ্বিতীয় ধাপে আপনি কোডটি 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 যা ব্যাকস্পেসের সাথে করব। যেহেতু আমি এটি কীভাবে সিএমডি লিখতে জানি না, তাই আমি: EVALUATE ফাংশনটি ব্যবহার করি যা ভিবিএস সিআর () ফাংশনটি চালায় এবং ব্যাকস্পেস-চরিত্রটিকে ভেরিয়েবলের মধ্যে রাখে result। যদি কেউ আরও ভাল উপায় জানেন তবে দয়া করে পরামর্শ দিন।


1
পাওয়ারশেলে আপনি $host.ui.RawUI.CursorPositionকোনও ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন এবং কার্সারটি যেখানে ছিলেন সেখানে ফিরে এসে আপনার আউটপুট ওভাররাইট করতে পুনরুদ্ধার করতে পারেন। পাওয়ারশেলের জন্য কেবলমাত্র একটি বিকল্প, তবে আপনার ভিবিএস স্টাফের চেয়ে কিছুটা পরিষ্কার হতে পারে :-)
mihi

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:
জিম্বা

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
আমার আসল ইস্যুটি প্রথমবার পোস্ট করা উচিত ছিল ...
অবাক

অবশ্যই আপনি করতে পারেন; পদক্ষেপ 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রয়ে যায়। কীভাবে এটি ঠিক করবেন তা নিশ্চিত নন।
স্টি

পরবর্তী প্রম্পটে অতিরিক্ত শ্বেত স্পেস অক্ষর ব্যবহার করে এই সমস্যাটি সমাধান করা যেতে পারে। আগের কোনও অক্ষর coverাকতে। এর set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL বিরোধিতা হিসাবে উদাহরণset /p "=Step 2!Newline!" <NULSPACEচরিত্রের জন্য বিনিময় ।
স্টি

পূর্ববর্তী রেখাগুলি যদি দীর্ঘ হয় তবে অতিরিক্ত অক্ষর ফাঁকাতে ফাঁকা স্থান যুক্ত করুন, বা রেখার শেষ থেকে শুরু পর্যন্ত ব্যাকস্পেস বা অতিরিক্ত অক্ষরের জন্য কেবল ব্যাকস্পেস করুন।
জিম্বা

0

তোমার মত স্ক্রিন-কার্সার গ্রন্থাগার প্রয়োজন চাই cursesবা ncurses, কিন্তু আমি তাদের ব্যবহার সঙ্গে মাত্রাতিরিক্ত পরিচিত নই। উভয় গ্রন্থাগার ইউনিক্স সিস্টেমের জন্য তৈরি করা হয়েছিল, তবে আপনি সেগুলি উইন্ডোজের জন্য ( সাইগউইন পরিবেশে বা GnuWin32 ) খুঁজে পেতে পারেন।

ডস-স্টাইলে ব্যাচ ফাইলে এগুলি অ্যাক্সেসের কোনও সহজ উপায় আমি জানি না। আপনি সংকলিত ভাষায় প্রোগ্রামিংয়ের চেয়ে ভাল হতে পারেন। এটি কার্যকর হবে কিনা সে সম্পর্কে আরও ভাল ধারণা পেতে Ncurses HOWTO এ একবার দেখুন ।


শাপগুলি কেবলমাত্র টার্মিনাল এবং টার্মিনাল এমুলেটরগুলির জন্য। তারা উইন্ডোজের নেটিভ কনসোল এপিআই-তে ম্যাপ করে না।
জোয়

বাহ্যিক গ্রন্থাগারের প্রয়োজন নেই; সিএমডি সরঞ্জামগুলির সাথে সূক্ষ্মভাবে কাজ করে।
জিম্বা

0

সমাধান ঘ

সঙ্গে নোটপ্যাড ++, এটি সন্নিবেশ করতে সম্ভব 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

নোটপ্যাড ++ স্ক্রিনশট

উইন্ডোজ ব্যাচ ওভাররাইট


আউটপুট

সিএমডি আউটপুট


সমাধান 2

আর একটি সম্ভাবনা হ'ল ইউনিকোড অক্ষর (ইউ + 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.