programing

Windows 배치: 줄 바꿈 없이 에코

mailnote 2023. 5. 31. 18:22
반응형

Windows 배치: 줄 바꿈 없이 에코

셸 입니까?echo -n출력의 끝에 있는 새 줄을 억제하는 것은 무엇입니까?

이 아이디어는 루프 안에서 같은 줄에 쓰는 것입니다.

용사를 합니다.set 리고그고./pline 없이 수 : 줄 없 이 할 코 매 개 수 변 는 있 새수에: :

C:\> echo Hello World
Hello World

C:\> echo|set /p="Hello World"
Hello World
C:\>

원천

사용:echo | set /p=또는<NUL set /p=둘 다 새 라인을 억제하는 데 효과가 있을 것입니다.

설정이 해지면서 ERROR LEVEL을 확인할 때 할 때 할 수 set /p=변수 이름을 지정하지 않으면 ERRORLEVEL이 1로 설정됩니다.

더미 변수 " 나 은 접 근 같 더 이 사 것 입 니 다 는 하 용 을 더 름 변 수 미 은 법 다 은 음 과 다 니 ▁name ▁a ▁like 입 것 : ▁a ▁would 더 ▁variable ▁use ▁so ▁be
echo | set /p dummyName=Hello World

방법을 했기 에 배경에서 되는 것 것을 낼이지만, 파이프 에서만 작동합니다; 은제어가려백방에서드어때했운교이없것여원정만낼것것입어다니들히확이을하는분러이도한활떤것그라문에기아찾야법운을▁this;▁works▁with▁want▁the다낼니것입▁exactly▁you▁buted▁without만어▁only들▁this▁will▁going▁pip▁version▁any▁what정히▁produce▁i확이▁as것ground을,▁sne▁the▁back▁on. 하지만 이것은 파이프 버전에서만 작동합니다.<NUL set /p dummyName=Hello오류 레벨이 계속 1로 상승합니다.

간단한 SET/P 방법에는 Windows 버전에 따라 약간씩 차이가 있는 제한이 있습니다.

  • 선행 따옴표가 제거될 수 있습니다.

  • 선행 공백이 제거될 수 있음

  • 이는끄=구문 오류를 발생시킵니다.

자세한 내용은 http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 을 참조하십시오.

젭은 선피드 없이 출력 텍스트의 문제를 대부분 해결하는 영리한 솔루션을 게시했습니다. 심지어 선행 공간을 사용하거나 = XP 이후 버전의 Windows에서 새 선 없이도 유효한 배치 문자열을 안전하게 인쇄할 수 있도록 방법을 개선했습니다.참고::writeInitialize메소드에 사이트에 잘 게시되지 않을 수 있는 문자열 리터럴이 포함되어 있습니다.문자 시퀀스를 설명하는 주석이 포함되어 있습니다.

:write그리고.:writeVar메소드는 문제가 되는 선행 문자를 포함하는 문자열만 나의 수정된 버전의 젭의 복사 메소드를 사용하여 작성되도록 최적화되었습니다.문제가 없는 문자열은 더 간단하고 빠른 SET/P 방법을 사용하여 작성됩니다.

@echo off
setlocal disableDelayedExpansion
call :writeInitialize
call :write "=hello"
call :write " world!%$write.sub%OK!"
echo(
setlocal enableDelayedExpansion
set lf=^


set "str= hello!lf!world^!!!$write.sub!hello!lf!world"
echo(
echo str=!str!
echo(
call :write "str="
call :writeVar str
echo(
exit /b

:write  Str
::
:: Write the literal string Str to stdout without a terminating
:: carriage return or line feed. Enclosing quotes are stripped.
::
:: This routine works by calling :writeVar
::
setlocal disableDelayedExpansion
set "str=%~1"
call :writeVar str
exit /b


:writeVar  StrVar
::
:: Writes the value of variable StrVar to stdout without a terminating
:: carriage return or line feed.
::
:: The routine relies on variables defined by :writeInitialize. If the
:: variables are not yet defined, then it calls :writeInitialize to
:: temporarily define them. Performance can be improved by explicitly
:: calling :writeInitialize once before the first call to :writeVar
::
if not defined %~1 exit /b
setlocal enableDelayedExpansion
if not defined $write.sub call :writeInitialize
set $write.special=1
if "!%~1:~0,1!" equ "^!" set "$write.special="
for /f delims^=^ eol^= %%A in ("!%~1:~0,1!") do (
  if "%%A" neq "=" if "!$write.problemChars:%%A=!" equ "!$write.problemChars!" set "$write.special="
)
if not defined $write.special (
  <nul set /p "=!%~1!"
  exit /b
)
>"%$write.temp%_1.txt" (echo !str!!$write.sub!)
copy "%$write.temp%_1.txt" /a "%$write.temp%_2.txt" /b >nul
type "%$write.temp%_2.txt"
del "%$write.temp%_1.txt" "%$write.temp%_2.txt"
set "str2=!str:*%$write.sub%=%$write.sub%!"
if "!str2!" neq "!str!" <nul set /p "=!str2!"
exit /b


:writeInitialize
::
:: Defines 3 variables needed by the :write and :writeVar routines
::
::   $write.temp - specifies a base path for temporary files
::
::   $write.sub  - contains the SUB character, also known as <CTRL-Z> or 0x1A
::
::   $write.problemChars - list of characters that cause problems for SET /P
::      <carriageReturn> <formFeed> <space> <tab> <0xFF> <equal> <quote>
::      Note that <lineFeed> and <equal> also causes problems, but are handled elsewhere
::
set "$write.temp=%temp%\writeTemp%random%"
copy nul "%$write.temp%.txt" /a >nul
for /f "usebackq" %%A in ("%$write.temp%.txt") do set "$write.sub=%%A"
del "%$write.temp%.txt"
for /f %%A in ('copy /z "%~f0" nul') do for /f %%B in ('cls') do (
  set "$write.problemChars=%%A%%B    ""
  REM the characters after %%B above should be <space> <tab> <0xFF>
)
exit /b

SET/P에서 제거된 흰색 공간에 대한 솔루션:

요령은 도스용 텍스트 편집기 EDIT에서 소환할 수 있는 백스페이스 문자입니다.편집에서 작성하려면 ctrlP+ctrlH를 누릅니다.여기에 붙여넣고 싶은데, 이 웹 페이지에서 표시할 수 없습니다.하지만 메모장에서 볼 수 있습니다(중앙에 흰색 원이 있는 작은 검은색 사각형처럼 선명합니다).

그래서 당신은 다음과 같이 씁니다.

<nul set /p=.9    Hello everyone

점은 임의의 문자일 수 있으며, SET/P에 텍스트가 공백 앞에서 시작하고 "Hello"에서 시작하지 않음을 알리는 데만 사용됩니다."9"는 여기에 표시할 수 없는 백스페이스 차트를 나타냅니다.당신은 9 대신에 그것을 놓아야 하고, 그것은 "."를 삭제할 것이고, 그 후에 당신은 이것을 얻을 것입니다.

    Hello Everyone

다음 대신:

Hello Everyone

도움이 되길 바랍니다.

@xmechanix의 답변에 대한 부록으로, 저는 파일에 내용을 적음으로써 다음과 같은 것을 알게 되었습니다.

echo | set /p dummyName=Hello World > somefile.txt

이렇게 하면 인쇄된 문자열 끝에 공백이 추가되므로 특히 문자열 끝에 새 줄(다른 공백 문자)을 추가하지 않도록 하기 때문에 불편할 수 있습니다.

다행히도 인쇄할 문자열을 인용합니다. 즉, 다음을 사용합니다.

echo | set /p dummyName="Hello World" > somefile.txt

끝에 줄이나 공백 없이 문자열을 인쇄합니다.

방법이 . 매개 변수를 이 변수를 -NewLine과 합니다. -NewLine과 Powershell Write-Host는 Powershell Write-Host와 결합합니다.start /b배치와 동일한 기능을 제공합니다.

새 줄 없음.cmd

@ECHO OFF
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - ';Write-Host -NoNewLine 'Result 2 - ';Write-Host -NoNewLine 'Result 3 - '"
PAUSE

산출량

Result 1 - Result 2 - Result 3 - Press any key to continue . . .

아래의 것은 약간 다르며 OP가 원하는 대로 작동하지 않지만 각 결과가 카운터를 에뮬레이트하는 이전 결과를 덮어쓰므로 흥미롭습니다.

@ECHO OFF
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 2 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 3 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 4 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 5 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 6 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 7 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 8 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 9 - '"
PAUSE

gnuwin32(coreutils 패키지)에서 "tr"을 사용하여 새 라인을 제거할 수 있습니다.

@echo off
set L=First line
echo %L% | tr -d "\r\n"
echo Second line
pause

그런데 스크립팅을 많이 하고 있다면 gnuwin32는 금광입니다.

저는 @arnep의 아이디어로 함수를 만들었습니다.

echo|set /p="헬로 월드

여기 있습니다.

:SL (sameline)
echo|set /p=%1
exit /b

함께사와 함께 합니다.call :SL "Hello There"
이것이 특별한 것이 아니라는 것을 알지만, 그것을 생각하는 데 너무 오랜 시간이 걸렸고, 나는 그것을 여기에 게시하기로 결심했습니다.

DIYcw.exe(쓰기)

기성품이나 기성품을 찾지 못하면 DIY를 할 수 있습니다. 와함께로.cw유틸리티 당신은 모든 종류의 캐릭터를 사용할 수 있습니다.적어도 그렇게 생각하고 싶습니다.스트레스 테스트를 한 후에 저에게 알려주세요.

도구들

.NET을 설치하기만 하면 되는데, 이는 요즘 매우 일반적입니다.

자재

일부 문자가 입력/복사 붙여넣기되었습니다.

스텝

  1. 를 작성.bat다음 내용으로 파일을 작성합니다.
/* >nul 2>&1

@echo off
setlocal

set exe=cw
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do set "csc=%%v"

"%csc%" -nologo -out:"%exe%.exe" "%~f0"

endlocal
exit /b %errorlevel%

*/

using System;

namespace cw {
    class Program {
        static void Main() {
            var exe = Environment.GetCommandLineArgs()[0];
            var rawCmd = Environment.CommandLine;
            var line = rawCmd.Remove(rawCmd.IndexOf(exe),exe.Length).TrimStart('"');
            line = line.Length < 2 ? "\r" : line.Substring(2) ;
            Console.Write(line);
        }
    }
}
  1. 실행합니다.

  2. 할 수 4KB 유틸리티를 할 수 ..bat.

이 로 생성된 "" " " " " " " 를 할 수 ..exe%temp%배치에서 사용하고 완료되면 삭제합니다.

사용방법

이 새로운줄 : " 줄을사용지않하쓰무십오시를새가언고쓰▁if오시십▁something새▁without를:".
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".

리턴으로)을 , 하세요.
cw

명령줄에서 이 작업을 수행합니다.

for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw)

샘플 1: 이것은 작동하고 종료 코드 = 0을 생성합니다.좋습니다.에코 바로 뒤에 있는 "."에 주목합니다.

C:\Users\phife.dog\gitrepos\1\repo_abc\scripts #
@filename.| set /p JUNK_VAR=Linux echo-n은 echo-n의 파일입니다.%(으)로 %ERRORLEVEL %(으)

이 메시지는 Linux echo-n에서 표시하는 것과 같은 메시지입니다.0

샘플 2: 작동하지만 종료 코드 = 1이 생성됩니다.그것은 나쁩니다.에코 후에는 ","가 부족합니다.그것이 차이인 것 같습니다.

C:\Users\phife.dog\gitrepos\1\repo_abc\scripts #
@filename | set /p JUNK_VAR=Linux echo-n은 echo-n을 지원합니다...%(으)로 %ERRORLEVEL %(으)

이 메시지는 Linux echo-n에서 표시하는 것과 같은 메시지입니다.1

여기서

<nul set /p =Testing testing

그리고 또한 공간 사용으로 시작하는 반향을 일으키기도 합니다.

echo.Message goes here

어쩌면 이게 당신이 찾고 있는 것일 수도 있어요. 오래된 학교 대본이에요.:P

set nl=^& echo. 
echo %nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%
echo only in prompt.
pause

아니면 새 줄에 쓰는 대신 현재 줄을 바꾸려는 것일 수도 있습니다."." 기호 뒤에 있는 "%bs%"를 제거하고 "예시 메시지" 뒤에 있는 다른 "%bs%"를 띄어쓰기하여 이를 실험할 수 있습니다.

for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "bs=%%a"
<nul set /p=.%bs%         Example message         %bs%
pause

저는 이것이 정말 흥미롭다고 생각합니다. 왜냐하면 이것은 그것이 의도한 것이 아닌 다른 목적을 위해 변수를 사용하기 때문입니다. 보시다시피 "%bs%"는 백스페이스를 나타냅니다.두 번째 %bs%는 "예시 메시지" 뒤에 공백을 추가하기 위해 백스페이스를 사용하여 "예시 메시지" 뒤에 보이는 문자를 실제로 추가하지 않고 "일시 중지 명령 출력"을 구분합니다.그러나 이는 정기적인 백분율 기호로도 가능합니다.

이 질문에 대한 답변에서 영감을 받아 진행률 값(0~100%)을 동일한 줄에 계속 인쇄하는 간단한 카운터 배치 스크립트를 만들었습니다(이전 것을 덮어씁니다).아마도 이것은 비슷한 해결책을 찾는 다른 사람들에게도 가치가 있을 것입니다.

비고: The*할 수 없는이므로 [인쇄할수문로므이자합 []를사용하여 .Alt+Numpad 0+Numpad 8키즉 ] 키 조합, 키 조합backspace성격.

@ECHO OFF

FOR /L %%A in (0, 10, 100) DO (     
    ECHO|SET /P="****%%A%%"    
    CALL:Wait 1
)

GOTO:EOF

:Wait
SET /A "delay=%~1+1"
CALL PING 127.0.0.1 -n %delay% > NUL
GOTO:EOF

set /p 명령을 사용하여 새 줄을 표시하지 않을 수 있습니다.set /p 명령은 공백을 인식하지 못하므로 점과 백스페이스 문자를 사용하여 공백을 인식할 수 있습니다.변수를 메모리로 사용하고 인쇄할 내용을 저장하여 문장 대신 변수를 인쇄할 수도 있습니다.예:

@echo off
setlocal enabledelayedexpansion
for /f %%a in ('"prompt $H & for %%b in (1) do rem"') do (set "bs=%%a")
cls
set "var=Hello World! :)"
set "x=0"

:loop
set "display=!var:~%x%,1!"
<nul set /p "print=.%bs%%display%"
ping -n 1 localhost >nul
set /a "x=%x% + 1"
if "!var:~%x%,1!" == "" goto end
goto loop

:end
echo.
pause
exit

이렇게 하면 새 줄 없이도 무엇이든 인쇄할 수 있습니다.문자를 하나씩 출력하는 프로그램을 만들었는데, 루프를 변경하면 문자 대신 단어도 사용할 수 있습니다.

위의 예에서 저는 "지연된 확장 사용"을 사용하여 set /p 명령이 "!" 문자를 인식하지 못하고 대신 점을 인쇄합니다.느낌표 "!"를 사용하지 않기를 바랍니다 ;)

Bill Stewart의 훌륭한 "Shell Scripting Toolkit"에서 EchoX.EXE를 사용합니다.
윈도우즈 Cmd 스크립트에서 라인피드를 억제하는 방법:

@Echo Off
Rem Print three Echos in one line of output
EchoX -n "Part 1 - "
EchoX -n "Part 2 - "
EchoX    "Part 3"
Rem

제공:

Part 1 - Part 2 - Part 3
{empty line}
d:\Prompt>

이 사용법에 대한 도움말은 다음과 같습니다.

Usage: echox [-n] message
  -n       Do not skip to the next line.
  message  The text to be displayed.

유틸리티는 48K보다 작으며 경로에 있어야 합니다.할 수 .

오른쪽으로 합니다.
탭, 리턴을 인쇄 , 라드을리사여하트스
합니다.

툴킷에는 12가지의 훌륭한 스크립팅 트릭이 추가로 포함되어 있습니다.
다운로드 페이지에는 다른 세 가지 유용한 도구 패키지도 있습니다.

저는 "EchoPart.bat"이라는 간단한 한 줄 배치 파일이 꽤 유용하다는 것을 알았습니다.

@echo | set /p=%*

그런 다음 대화형 CMD 라인이나 바로 가기의 일부로 아래 라인과 같은 것을 작성할 수 있습니다.그것은 몇 가지 새로운 가능성을 열어줍니다.

echopart "Hello, " & echopart "and then " & echo Goodbye

여기에 이미지 설명 입력

배치 파일에서 사용하는 경우 텍스트는 불변 문자열 대신 매개 변수 변수에서 가져올 수 있습니다.예를 들어:

@echopart Hello %* & @echo , how are you?

따라서 "SayHello.bat"에서 이 행을 실행하면 다음을 수행할 수 있습니다.

여기에 이미지 설명 입력

아니면 심지어...

여기에 이미지 설명 입력

연극도 하고, 재미있게 놀아요!

저는 그런 선택은 없다고 생각합니다.또는 이것을 시도할 수 있습니다.

set text=Hello
set text=%text% world
echo %text%

이전 공백과 새 줄 없이 반향

앞에서 페드로가 말한 것처럼, 새로운 선이 없는 에코와 선행 공간 작업("9"가 참 [백스페이스]인 경우).

<nul set /p=.9    Hello everyone

새 콘솔을 사용하여 Windows 10에서 작동하는 데 몇 가지 문제가 있었지만 다음과 같은 방법으로 처리했습니다.
CMD에 다음을 입력합니다.

echo .◘>bs.txt

[+ [을"discovery"를.Alt] + [8]을 눌러 "discovery"가 표시되었습니다.
(실제 기호는 코드 페이지에 따라 다를 수 있습니다.)

그러면 메모장을 사용하여 "bs.txt"에서 결과를 쉽게 복사할 수 있습니다.필요한 곳으로 exe.

@echo off
<nul set /p "_s=.◘    Hello everyone"
echo: here

jscript 사용 시:

@if (@X)==(@Y) @end /*
    @cscript //E:JScript //nologo "%~nx0" %*
    @exit /b %errorlevel%
*/if(WScript.Arguments.Count()>0) WScript.StdOut.Write(WScript.Arguments.Item(0));

만약 그것을 쓰기라고 한다면요.다음과 같이 테스트할 수 있습니다.

call write.bat string & echo _Another_String_

powershell을 사용하지만 cmd가 정의된 변수와 함께 사용하려면 다음을 사용할 수 있습니다.

set str=_My_StrinG_
powershell "Write-Host -NoNewline ""%str%""""  & echo #Another#STRING#

여기서는 답변이 늦지만, 한 줄에 특수 문자를 써야 하는 사람이라면 데벤햄의 답변이 약 80줄로 너무 길며 단순히 사용하는 제한으로 스크립트가 중단될 수 있습니다(아마도 사용자 입력으로 인해).set /p또는 .된 C C-language 으로 구성한 .bat 또 .cmd 컴 C++ 또 C 어과파쌍로한성그다냥구실음행하는것다니것입쉬가울장이는는으일실행파일된를언▁.▁your▁it▁andable▁easiestbat▁pairbat▁just▁just▁then▁a▁▁to'다▁to.cout또는printf 때 한 쓸 수 해줍니다.이렇게 하면 OP처럼 문자를 사용하여 일종의 진행 표시줄이나 다른 것을 표시하는 경우 한 줄에 여러 번 쉽게 쓸 수 있습니다.

언급URL : https://stackoverflow.com/questions/7105433/windows-batch-echo-without-new-line

반응형