Windows lot: echo sans nouvelle ligne

Quel est L'équivalent Windows batch de la commande Linux shell echo -n qui supprime la nouvelle ligne à la fin de la sortie?

L'idée est d'écrire sur la même ligne à l'intérieur d'une boucle.

175
demandé sur mklement0 2011-08-18 13:46:33

16 réponses

en utilisant set et le paramètre /p vous pouvez faire écho sans newline:

C:\> echo Hello World
Hello World

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

Source

188
répondu arnep 2016-09-11 04:22:01

utilisant: echo | set /p= ou <NUL set /p= vont tous les deux travailler pour supprimer la nouvelle ligne.

cependant, cela peut être très dangereux lorsque l'écriture de scripts plus avancés lors de la vérification du niveau D'erreur devient importante car définir set /p= sans spécifier de nom de variable va définir le niveau d'erreur à 1.

Une meilleure approche serait d'utiliser une variable muette nom comme:

echo | set /p dummyName=Hello World

This va produire exactement ce que vous voulez sans aucun truc sournois en arrière-plan comme j'ai dû le découvrir à la dure, mais cela ne fonctionne qu'avec la version pipée; <NUL set /p dummyName=Hello va encore élever le niveau d'erreur à 1.

82
répondu xmechanix 2012-08-12 16:47:06

la méthode simple SET /P a des limites qui varient légèrement entre les versions de Windows.

  • les guillemets principaux peuvent être dénudés

  • L'espace blanc de tête peut être dénudé

  • lead = cause une erreur de syntaxe.

voir http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 pour plus d'informations.

jeb posté une solution intelligente qui résout la plupart des problèmes à texte de sortie sans linefeed, même avec l'espace de tête ou = j'ai raffiné la méthode de sorte qu'il puisse imprimer en toute sécurité absolument n'importe quelle chaîne de fournée valide sans la nouvelle ligne, sur n'importe quelle version de Windows à partir de XP. Notez que la méthode :writeInitialize contient une chaîne de caractères littérale qui peut ne pas afficher bien sur le site. Une remarque est inclus, qui décrit ce que devrait être la séquence de caractères.

les méthodes :write et :writeVar sont optimisées de telle sorte que seules les chaînes contenant des caractères principaux gênants sont écrites en utilisant ma version modifiée de la méthode de copie de jeb. Les chaînes Non-gênantes sont écrites en utilisant la méthode SET /P plus simple et plus rapide.

@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
23
répondu dbenham 2013-12-18 21:07:20

Une solution pour les dépouillé espace blanc dans SET /P:

le truc est que le char de backspace que vous pouvez invoquer dans l'éditeur de texte EDIT Pour DOS. Pour le créer dans EDIT appuyez sur ctrlp+ctrlh . Je voudrais coller ici, mais cette page web ne peut pas l'afficher. C'est visible sur le bloc-notes (c'est werid, comme un petit rectangle noir avec un cercle blanc au centre)

donc vous écrivez ceci:

<nul set /p=.9    Hello everyone

le point peut être n'importe quel char, il est seulement là pour dire à SET /P que le texte commence là, avant les espaces, et pas au " Hello ". Le" 9 " est une représentation du char de backspace que je ne peux pas afficher ici. Vous devez le mettre à la place du 9, et il supprimera le " . ", après quoi vous obtiendrez ceci:

    Hello Everyone

au lieu de:

Hello Everyone

j'espère que cela aide

8
répondu Pedro 2015-01-25 04:12:49

vous pouvez supprimer la nouvelle ligne en utilisant "tr" de gnuwin32 ( coreutils paquet")

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

Par ailleurs, si vous faites beaucoup de scripts, gnuwin32 est une mine d'or.

7
répondu BearCode 2012-12-18 20:40:01

comme addendum à la réponse de @xmechanix, j'ai remarqué en écrivant le contenu d'un fichier:

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

que cela va ajouter un espace supplémentaire à la fin de la chaîne imprimée , qui peut être gênant, d'autant plus que nous essayons d'éviter d'ajouter une nouvelle ligne (un autre caractère d'espace) à la fin de la chaîne.

heureusement, en citant la chaîne à imprimer, c.-à-d. en utilisant:

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

imprimera la chaîne sans aucun caractère de nouvelle ligne ou d'espace à la fin.

7
répondu Joan Bruguera 2016-02-05 08:37:37

Voici une autre méthode, il utilise PowerShell Write-Host qui a un paramètre-NoNewLine, combinez cela avec start /b et il offre la même fonctionnalité de lot.

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

sortie

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

celui ci-dessous est légèrement différent, ne fonctionne pas exactement comme L'OP veut, mais est intéressant parce que chaque résultat écrase le résultat précédent émulant un compteur.

@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
5
répondu Knuckle-Dragger 2014-01-26 19:59:00

peut-être que c'est ce que vous cherchez, c'est un vieux script d'école... : 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

ou peut-être que vous essayez de remplacer une ligne au lieu d'écrire une nouvelle ligne? vous pouvez l'expérimenter en supprimant le "%bs%" après le "."et aussi par l'espacement de l'autre "%bs%" après "Exemple de message".

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

je trouve cela vraiment intéressant parce qu'il utilise une variable pour un but autre que ce qu'il est prévu de faire. comme vous pouvez le voir, le "%bs%" représente un backspace. Le second " %bs% "utilise l'espace de retour pour ajouter des espaces après le" message D'exemple "pour séparer la sortie de la" commande Pause "sans ajouter de caractère visible après le"message D'exemple". Cependant, cela est également possible avec un signe de pourcentage.

2
répondu zask 2016-01-25 19:13:10

à Partir de ici

<nul set /p =Testing testing

et aussi à l'écho en commençant par les espaces utilisent

echo.Message goes here
2
répondu Afdsafnadsjbcewjhwnfy4ntc874fg 2018-06-28 11:38:12

BRICOLAGE cw.exe (console d'écriture) de l'utilitaire

si vous ne le trouvez pas hors-la-boîte, de série, vous pouvez briller. Avec cet utilitaire cw , vous pouvez utiliser tous les types de caractères. Au moins, j'aime à penser de la sorte. Faites un test de résistance et prévenez-moi.

Outils

Tout ce dont vous avez besoin est .NET installé, qui est très commun de nos jours.

matériaux

certains caractères dactylographiés/collés.

Étapes

  1. Créer .bat fichier avec le contenu suivant.
/* >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. de l'Exécuter.

  2. Maintenant vous avez un bel utilitaire 4KB donc vous pouvez supprimer le .bat .

alternativement, vous pouvez insérer ce code comme sous-programme dans n'importe quel lot, envoyez le résultat .exe à %temp% , utilisez-le dans votre lot et supprimez-le lorsque vous avez terminé.

comment utiliser

si vous voulez écrire quelque chose sans nouvelle ligne:

cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".

si vous voulez un retour chariot (aller au début de la ligne), courir juste

cw

alors essayez ceci depuis la ligne de commande:

for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw)
2
répondu cdlvcdlv 2018-07-17 11:24:52

vous pouvez supprimer la nouvelle ligne en utilisant la commande set /p. La commande set /p ne reconnaît pas un espace, car vous pouvez utiliser un point et un caractère d'espace pour le faire reconnaître. Vous pouvez également utiliser une variable comme une mémoire et stocker ce que vous souhaitez imprimer en elle, de sorte que vous pouvez imprimer la variable au lieu de la phrase. Par exemple:

@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

De cette façon, vous pouvez imprimer n'importe quoi sans une nouvelle ligne. J'ai fait le programme imprime les caractères un par un, mais vous pouvez aussi utiliser des mots au lieu de caractères en changeant la boucle.

dans l'exemple ci-dessus, j'ai utilisé "enabledelayedexpansion" pour que la commande set /p ne reconnaisse pas "!"personnage et imprime un point au lieu de cela. J'espère que vous n'avez pas l'utilisation du point d'exclamation "!";)

1
répondu J.V.Raghava rama Sharma 2016-06-08 17:56:20

échantillon 1: cela fonctionne et produit un code de sortie = 0. Ce qui est Bon. Notez le "."juste après l'écho.

C:\Users\phife.dog\gitrepos\1\repo_abc\scripts #

@echo./set / P JUNK_VAR=ceci est un message affiché comme Linux echo-n l'afficherait ... & echo %ERRORLEVEL%

c'est un message affiché comme Linux echo-n l'afficherait ... 0

échantillon 2: Cela fonctionne mais produit le code de sortie = 1. Ce qui est Mauvais. Veuillez noter que le manque de "."après l'écho. Qui semble être la différence.

C:\Users\phife.dog\gitrepos\1\repo_abc\scripts #

@echo /set / P JUNK_VAR=ceci est un message affiché comme Linux echo-n l'afficherait ... & echo %ERRORLEVEL%

c'est un message affiché comme Linux echo-n l'afficherait ... 1

1
répondu user3175529 2018-04-05 20:38:34

je crois qu'il n'y a pas d'option. Vous pouvez aussi essayer ce

set text=Hello
set text=%text% world
echo %text%
0
répondu m0skit0 2011-08-18 09:56:45

Retard de réponse ici, mais pour ceux qui ont besoin d'écrire les caractères spéciaux en une seule ligne qui trouvent dbenham 's réponse d'environ 80 lignes trop longues et dont les scripts peuvent casser (peut-être en raison de l'entrée utilisateur) sous les limites de la simple set /p , il est probablement plus facile de simplement à votre paire .bat ou .cmd avec un exécutable C++ ou C-language compilé et puis juste cout ou printf les caractères. Cela vous permettra également d'écrire facilement plusieurs fois à une ligne si vous montrez une sorte de barre de progression ou quelque chose en utilisant des caractères, comme OP l'était apparemment.

0
répondu SeldomNeedy 2017-05-23 12:26:26

j'ai créé une fonction à partir de l'idée de @arnep:

echo / set / p= "Hello World"

le voici:

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

utilisez - le avec call :SL "Hello There"

je sais que ce n'est rien de spécial, mais ça m'a pris tellement de temps pour y penser que j'ai pensé le poster ici.

0
répondu Mark Dodsons 2018-08-18 21:20:33

vous pouvez utiliser la commande de substitution printf ou imprimer et utiliser retour chariot pour obtenir ce

ex: printf "Hello World\r "

La syntaxe complète est disponible ici: http://wiki.bash-hackers.org/commands/builtin/printf

-3
répondu Anonymous 2016-09-10 01:49:11