echo -n
출력이 끝날 때 줄 바꿈을 억제하는 Linux 셸 명령과 동등한 Windows 배치는 무엇입니까 ?
아이디어는 루프 내에서 같은 줄에 쓰는 것입니다.
echo
걸릴 수 있었다는 것을 알았지 -n
만 cmd.exe
그것은 단지 작동하지 않을 것이다 ^^
echo
수 있습니다 -n
" 라는 주석 이 잘못되었습니다.
echo -n
출력이 끝날 때 줄 바꿈을 억제하는 Linux 셸 명령과 동등한 Windows 배치는 무엇입니까 ?
아이디어는 루프 내에서 같은 줄에 쓰는 것입니다.
echo
걸릴 수 있었다는 것을 알았지 -n
만 cmd.exe
그것은 단지 작동하지 않을 것이다 ^^
echo
수 있습니다 -n
" 라는 주석 이 잘못되었습니다.
답변:
개행없이 에코 set
와 /p
매개 변수를 사용하여 :
C:\> echo Hello World
Hello World
C:\> echo|set /p="Hello World"
Hello World
C:\>
<nul set /p =Hello
. set /p
등호를 첫 문자 나 공백 / 탭으로 에코 할 수 없습니다.
< nul
는 NUL
장치 에서 리디렉션입니다 . 아무 것도 포함되어 있지 않지만 set /p
사용자 입력 대기를 중지 하기에 충분합니다.
사용 : echo | set /p=
또는 <NUL set /p=
개행을 억제하기 위해 둘 다 작동합니다.
그러나 set /p=
변수 이름을 지정하지 않고 설정하면 ERRORLEVEL이 1로 설정되므로 ERRORLEVEL을 확인할 때 고급 스크립트를 작성할 때 매우 위험 할 수 있습니다 .
더 좋은 방법은 더미 변수 이름을 다음과 같이 사용하는 것입니다.
echo | set /p dummyName=Hello World
이렇게하면 어려운 방법을 찾아야했을 때 배경에서 교활한 물건을 사용하지 않고도 원하는 것을 정확하게 얻을 수 있지만 파이프 버전에서만 작동합니다. <NUL set /p dummyName=Hello
여전히 ERRORLEVEL을 1로 올립니다.
간단한 SET / P 방법에는 Windows 버전마다 약간의 제한이 있습니다.
선행 인용 부호가 제거 될 수 있습니다
선행 공백이 제거 될 수 있습니다.
선행 =
구문 오류가 발생합니다.
자세한 내용은 http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 를 참조하십시오.
jeb는 선행 공간이 있더라도 줄 바꿈없이 출력 텍스트 의 대부분의 문제를 해결하는 영리한 솔루션을 게시 했습니다. XP부터. 참고:writeInitialize
메서드에는 사이트에 제대로 게시되지 않을 수있는 문자열 리터럴이 포함되어 있습니다. 문자 순서가 무엇인지 설명하는 설명이 포함되어 있습니다.
:write
및 :writeVar
방법은 번잡 한 최고의 문자가 포함 된 문자열 만이 젭의 COPY 방법의 내 수정 된 버전을 사용하여 작성되도록 최적화되어 있습니다. 까다 롭지 않은 문자열은 더 간단하고 빠른 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
ECHO.
, 제외하고 ECHO.
모호한 상황에서 실패 할 수 있습니다 . 모호한 상황에서도 실패 할 수있는 다른 형태가 많이 있습니다. 항상 작동하는 유일한 것은 ECHO(
입니다.
@xmechanix의 답변에 대한 부록으로 파일에 내용을 쓰는 것으로 나타났습니다.
echo | set /p dummyName=Hello World > somefile.txt
인쇄 된 문자열의 끝에 여분의 공간 이 추가됩니다. . 특히 새 줄 (다른 공백 문자)을 추가하지 않기 때문에 불편할 수 있습니다.
다행스럽게도 인쇄 할 문자열을 인용합니다. 예 :
echo | set /p dummyName="Hello World" > somefile.txt
끝에 줄 바꿈이나 공백 문자없이 문자열을 인쇄합니다.
World
와 사이에 공백을 넣지 않으면 여분의 공간이 사라져야합니다 >
.
set /p="abc"<nul|xxd -p
표시 616263
반면, set /p=abc<nul|xxd -p
제공61626320
SET / P에서 제거 된 공백에 대한 솔루션 :
트릭은 텍스트 편집기 에서 DOS 용으로 편집 할 수있는 백 스페이스 문자입니다 . 편집에서 작성하려면 ctrlP + ctrlH를 누르 십시오 . 여기에 붙여 넣을 수 있지만이 웹 페이지는 표시 할 수 없습니다. 메모장에서 볼 수 있습니다 (중앙에 흰색 원이있는 작은 검은 사각형처럼 작습니다)
그래서 당신은 이것을 작성합니다 :
<nul set /p=.9 Hello everyone
점은 임의의 문자 일 수 있습니다. SET / P에게 텍스트가 공백보다 먼저 시작되고 " Hello "가 아니라고 시작한다는 것을 알 수 있습니다 . " 9 "는 여기에 표시 할 수없는 백 스페이스 문자를 나타냅니다. 당신은 9 대신에 그것을 넣어야하며, " . "을 삭제하면 , 다음과 같은 결과를 얻게됩니다 :
Hello Everyone
대신에:
Hello Everyone
나는 그것이 도움이되기를 바랍니다
gnuwin32 ( coreutils 패키지) 에서 "tr"을 사용하여 줄 바꿈을 제거 할 수 있습니다
@echo off
set L=First line
echo %L% | tr -d "\r\n"
echo Second line
pause
그건 그렇고, 많은 스크립팅을하고 있다면 gnuwin32는 금광입니다.
trim
있습니까?
\r
, \n
또는 \r\n
(각각 OSX,하여 Posix 및 Windows의 새로운 라인) "공간"문자 수 없습니다.
또 다른 방법은 -NoNewLine 매개 변수가있는 Powershell Write-Host를 사용 start /b
하고이를 결합하고 배치와 동일한 기능을 제공하는 방법입니다.
NoNewLines.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
어쩌면 이것은 당신이 찾고있는 것입니다, 그것은 오래된 학교 대본입니다 ... : 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 %"는 백 스페이스를 사용하여 "예제 메시지"뒤에 공백을 추가하여 "예제 메시지"뒤에 실제로 보이는 문자를 추가하지 않고 "일시 정지 명령의 출력"을 분리합니다. 그러나 이는 정기적 인 백분율 기호로도 가능합니다.
set nl=^& echo.
트릭을 어디에나 보았고 변수 이름이 잘못되었습니다. % nl %는 줄 바꿈 문자 가 아닙니다 . 결국 줄 바꿈 이 끝날 때마다 새 명령을 실행 하므로 줄 바꿈 이 실행 됩니다. 당신은 그것을 작성하여 확인할 수 있습니다 . 당신 은 트릭을 공개 얻을 . 출력은 동일하지만 제안하는 이유가 아닙니다. &echo.
echo
echo "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%"
"& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. "
cw.exe
(콘솔 쓰기) 유틸리티즉시 사용 가능한 기성품을 찾지 못하면 DIY를 할 수 있습니다. 이것으로cw
유틸리티를 사용하면 모든 종류의 문자를 사용할 수 있습니다. 적어도 그렇게 생각하고 싶습니다. 스트레스 테스트를 해주시고 알려주십시오.
.NET 만 있으면됩니다 . 요즘 매우 일반적이다, 설치.
일부 문자는 입력 / 복사하여 붙여 넣습니다.
.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);
}
}
}
그것을 실행하십시오.
이제 멋진 4KB 유틸리티가 있으므로를 삭제할 수 있습니다 .bat
.
또는이 코드를 배치에 서브 루틴으로 삽입하고에 결과 .exe
를 보내 배치 %temp%
에 사용하고 완료되면 삭제할 수 있습니다.
줄 바꿈없이 무언가를 쓰려면 :
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 #
@echo. | set / p JUNK_VAR = 이것은 Linux echo -n처럼 표시되는 메시지입니다 ... & echo % ERRORLEVEL %
이것은 Linux echo -n처럼 표시되는 메시지입니다 ... 0
샘플 2 : 이것은 작동 하지만 종료 코드 = 1을 생성합니다. 에코 후 "."가 부족하다는 점에 유의하십시오. 차이가있는 것 같습니다.
C : \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ scripts #
@echo | set / p JUNK_VAR = 이것은 Linux echo -n처럼 표시되는 메시지입니다 ... & echo % ERRORLEVEL %
이것은 리눅스 에코 -n처럼 표시되는 메시지입니다 ... 1
이 질문에 대한 답변에서 영감을 얻어 진행률 값 (0-100 %)을 같은 줄에 계속 인쇄하는 간단한 카운터 배치 스크립트를 만들었습니다 (이전 줄을 덮어 씁니다). 어쩌면 이것은 비슷한 솔루션을 찾는 다른 사람들에게도 가치가있을 것입니다.
비고 : *
인쇄 할 수없는 문자이므로 문자 인 [ 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 text=Hello
set text=%text% world
echo %text%
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
이런 식으로 줄 바꿈없이 무엇이든 인쇄 할 수 있습니다. 문자를 하나씩 인쇄하도록 프로그램을 만들었지 만 루프를 변경하여 문자 대신 단어를 사용할 수도 있습니다.
위 예제에서 "enabledelayedexpansion"을 사용하여 set / p 명령이 "!"를 인식하지 못합니다. 문자 대신 점을 인쇄합니다. 느낌표 "!"를 사용하지 않기를 바랍니다. ;)
늦은 여기에 대답하지만, 발견 한 줄에 특수 문자를 쓸 필요가 사람을위한 dbenham 의 대답은 그 스크립트를 간단하게 사용하는 한계에서 (아마도 때문에 사용자 입력에) 중단 될 수 있습니다 너무 오래 (80 개) 라인에 대해 수하고 set /p
, .bat 또는 .cmd를 컴파일 된 C ++ 또는 C- 언어 실행 파일과 쌍 cout
또는 printf
문자 로 연결하는 것이 가장 쉬운 방법 일 것입니다 . 이것은 OP처럼 분명히 진행률 표시 줄이나 문자를 사용하여 무언가를 표시하는 경우 한 줄에 여러 번 쉽게 쓸 수 있습니다.
printf
Win-7 cmd
창 "'printf' is not recognized as an internal or external command, operable program or batch file."
printf
창 고유가 아닙니다. 이것은 Windows 질문입니다.