2010-11-04 81 views
7

我看了一下之前關於你的db的問題,我沒有嘗試一個答案,但我試了一下。回聲在同一行

我想編寫以下行代碼:

echo Executing backup.... 
backup procedure 
echo Ok 

但輸出應該是:

Executing backup... Ok 

這是可能的?

+1

你在哪個操作系統上? – 2010-11-04 13:21:37

+0

是的,Windows Server 2003中,我忘了... – aemme 2010-11-04 13:31:10

回答

9

我想你使用的是DOS/NT-批次。

這是可能與該組/ p命令,因爲集/ P不打印一個CRLF

set /p "=Executing backup...." <nul 
echo OK 

此外有可能以擦除帶有CR字符的行。 重要的是要知道set/p前面的空白字符被忽略(在Vista中,而不是在XP中),所以!cr!必須晚些時候或結束。 CR只能用delayedExpansion顯示,因爲%cr%起作用,但在擴展百分比階段(或直接在此階段之後)刪除CR字符,但不在延遲擴展階段。

其中僅使用一個線用於顯示

@echo off 
setlocal EnableDelayedExpansion EnableExtensions 


call :CreateCR 
for /l %%n in (1,1,10000) do (
    set /P "=Count %%n!CR!" <nul 
) 
echo(
goto :eof 

:CreateCR 
rem setlocal EnableDelayedExpansion EnableExtensions 
set "X=." 
for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094! 

echo !X! > %temp%\cr.tmp 
echo\>> %temp%\cr.tmp 
for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do (
    endlocal 
    set cr=%%a 
    goto :eof 
) 
goto :eof 

EDIT的計數器的實施例:說明,如何可變cr被創建(完成一招)

可變X設定爲後單點(字符本身不重要),重複成爲8188個字符通過for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

然後va可變結構,兩個空間併兼具CR和LF的呼應與echo !X! > %temp%\cr.tmp文件(注意!X!>與自然行結尾呼應賠償內部之間的兩個空格)

我們現在有8192個字符,但數據緩衝區只能容納8191個字符,所以最後一個字符(換行符)將被刪除!

下一行echo\>> %temp%\cr.tmp,另一CR/LF組附加到文件(在命令中\僅僅是輸出沒有什麼吧回車和換行,因爲echo由它的自我會輸出ECHO is ON/OFF),這一點很重要,作爲一個單一的CR不能在行的末尾讀取(更多後面的內容)。

所以文件現在包含<8188 .'s><SPACE><SPACE><CR><CR><LF>

for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do讀取第二道理,delimters是標準的空間和標籤,所以第二個令牌是隻有一個CR,如下面的CR/LF作爲標準行結束刪除。

最後endlocal用於返回到環境,而臨時變量Xca現有的(如括號中是endlocal,它允許crendlocal前的設置,其實需要在括號結束影響(也可以寫成for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof

此外

這是創建一個CR字符我的第一種方式,但它需要一定的時間和臨時文件。
後來我看到一個更簡單的從copy /z命令中檢索CR的方法。

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 
+0

你寫的第一個例子perfetly作品。什麼是 aemme 2010-11-04 14:49:43

+0

jeb 2010-11-04 15:05:56

+0

user66001 2012-12-02 00:47:55

2

試試這個Posix的系統(Linux)的

echo -n "Executing backup.... " 
echo -n "backup procedure " 
echo "Ok" 

這是更難在Windows上。您將需要使用像這樣:

@echo off 
echo|set /p ="Executing backup...." 
echo|set /p =" backup procedure" 

檢查這個帖子:http://www.pcreview.co.uk/forums/showpost.php?s=1a20b16775d915998b30bd76a0ec5d35&p=4432915&postcount=7

+0

我使用Windows Server 2003 .... – aemme 2010-11-04 13:31:58

+0

@Piotr Czapla - 我不相信/每個集合(Windows示例)是必需的,或者至少它似乎沒有工作一樣。但是,試圖刪除它們時,有人阻止了編輯,所以也許這是錯誤的http://stackoverflow.com/questions/13665411/what-does-a-forward-slash-before-a-pipe-in​​-cmd-做去除的最行結束期的一#comment18755645_13665411。你能告訴我們需要嗎? – user66001 2012-12-02 02:25:24

+0

管道創建新的cmd.exe實例被提及在其他相關的thead(請參閱我的回覆) – 2016-06-23 01:35:43

1

這有點破解,但這是Windows的article describing how to do it

從文章,最後的結果(編輯您的設置)是這樣的:

SET /P var=Backing up 
%Result%....<NUL 

Backup_process %Result% >NUL 2>&1 

IF ERRORLEVEL 1 
    ECHO FAIL 
ELSE 
    ECHO OK 
+0

非常感謝,我只能接受1回答....我會看看它 – aemme 2010-11-04 15:40:47

0

我用VBScript做了類似的事情。

將這個代碼EchoNoNewline.vbs

If WScript.Arguments.Named.Exists("TEXT") Then 
    WScript.StdOut.Write WScript.Arguments.Named.Item("TEXT") 
End If 

從您的批處理文件,使用這樣的腳本:

CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Executing backup...." 
backup procedure 
CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Ok" 
-1

What does a forward slash before a pipe in cmd do to remove the line ending of an echo? 最好的建議是:

回顯沒有換行的文本是非常我因爲管道會創建兩個新的cmd.exe實例。 這是更簡單,更快地使用

 <nul set /p "=My Text" 

從NUL重定向也將停止對用戶輸入的等待。

+0

想知道爲什麼有人通過這個答案沒有用 – 2014-08-19 15:07:16

+0

因爲你這是我認爲的答案 – SomethingDark 2016-06-21 14:16:24

+0

你是認真的嗎?我在這裏發送的答案來自另一個線程。這裏接受的答案是一些非常長的文本 – 2016-06-22 16:11:18