Windows lot: echo sans nouvelle ligne
16 réponses
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.
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
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
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.
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
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.
à Partir de ici
<nul set /p =Testing testing
et aussi à l'écho en commençant par les espaces utilisent
echo.Message goes here
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
- 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);
}
}
}
-
de l'Exécuter.
-
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)
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 "!";)
é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
je crois qu'il n'y a pas d'option. Vous pouvez aussi essayer ce
set text=Hello
set text=%text% world
echo %text%
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.
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.
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