我需要在批处理文本文件中添加一个空格键
然而,下面的dosnt工作ECHO >C:\txt.txt
这会产生文本Echo is(off)而不是???
使用Windows批处理
答案 0 :(得分:6)
echo
正在打印文本“ECHO if off”,因为您没有提供任何参数。如果您输入echo /?
作为使用说明,您将看到此行为已定义:“键入不带参数的ECHO以显示当前回波设置”。因此,在您的情况下,echo设置为off。
如果你想拥有没有换行符和回车符的空格字符,你很可能需要使用set
。如果您使用的是Windows XP,这应该很简单。
>txt.txt ( <nul set /p "= " )
如果您正在运行Vista或更高版本,它会有点棘手,因为Windows会在set命令上删除前导空格。
您需要创建一个退格符,然后打印:
:: Create a backspace character
for /f %%A in ('"prompt $H &echo on &for %%B in (1) do rem"') do set BS=%%A
<nul set /p=%BS% > txt.txt
请注意,这实际上不会打印空格,而是打印退格字符。我不太确定这是否适合你,但我想不出任何更简单的方法。否则你可能最好使用其他一些脚本语言,比如python或powershell。
答案 1 :(得分:2)
回音空间(+换行符)
ECHO. > C:\txt.txt
请注意,这也会输出回车加换行符(回车)。所以你的文件将变成3个字节。
或者,您可以使用
创建一个0字节的文件fsutil file createnew c:\txt.txt 1
只有这不会添加空格,而是添加0个字符。
或者,您可以创建一个包含一个空格的文件,并在每次需要时将其复制到txt.txt
以包含空格。
使用外部工具,例如来自this zipfile from this site的echon.exe
。它模仿echo -n
,就像在Linux中一样。
答案 2 :(得分:2)
SET / P不仅不会在Vista及更高版本上打印前导空格,也无法打印前导=
。
以下代码适用于从XP开始的所有现代版Windows:
@echo off
setlocal enableDelayedExpansion
for /f %%A in ('copy /Z "%~dpf0" nul') do set EOL=%%A^
:: The above two empty lines are critical - DO NOT REMOVE
<nul set /p "=x!EOL! " >temp.tmp
findstr /v $ temp.tmp >file.txt
del temp.tmp
上述技术可以扩展到支持打印几乎任何字符串而不需要换行,但有一些例外:
该字符串不得包含回车符
XP FINDSTR会将大多数控制字符和许多扩展ASCII字符显示为点。有关详细信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?。
答案 3 :(得分:2)
要使用Win Vista或更高版本创建单个空间,您不能再使用SET/P
命令(如dbenham所述)。
但您可以使用copy
命令
@echo off
setlocal EnableDelayedExpansion
call :createSub
call :echoWithoutLinefeed "=hello"
call :echoWithoutLinefeed " world"
exit /b
:echoWithoutLinefeed
> txt.tmp (echo(%~1!sub!)
copy txt.tmp /a txt2.tmp /b > nul
type txt2.tmp
del txt.tmp txt2.tmp
exit /b
:createSub
copy nul sub.tmp /a > nul
for /F %%a in (sub.tmp) DO (
set "sub=%%a"
)
del sub.tmp
exit /b
首先,文字是带有简单ECHO
的输出,但最后会在SUB
追加ECHO
之前追加CR LF
个字符。
使用copy inputfile /a outputfile /b
时,所有字符都会复制到第一个SUB
字符。
答案 4 :(得分:1)
以下是32位Windows的两种方法:
此方法直接使用十六进制20(空格)创建文件:
@echo off
(for %%v in (E100''20 Nfile.tmp RCX 01 W Q) do @echo %%v)|debug >nul
ren file.tmp "file with a single space.txt"
这个删除了file.tmp文件中的两个尾随字符
@echo off
set f=file.tmp
echo. >%f%
(for %%v in (E100''83''E9''02 L103 P N%f% W103 Q) do echo %%v)|debug %f% >nul
ren %f% "file with a single space.txt"
答案 5 :(得分:0)
这适用于Vista及更高版本,任何位数。
@echo off
(
echo -----BEGIN CERTIFICATE-----
echo IA==
echo -----END CERTIFICATE-----
)>file.tmp
certutil -decode file.tmp "file with a single space.txt" >nul
del file.tmp
答案 6 :(得分:0)
这是另一种创建单字节单空间文件的方法,但无需创建任何中间临时文件。
它应该适用于所有基于NT的Windows版本。
@(
setlocal
REM Temporarity set Prompt to a single space char
set "Prompt=$S"
REM Start a new asynchronous cmd session which will inherit the new prompt value
REM The /d switch disables execution of AutoRun commands from registry
REM This is necessary to prevent AutoRun commands if any,
REM to output anything or change the Prompt value to something else
REM In fact, execution of any command will at least append a new line
REM to the output which is not what we want.
REM The /q switch will start cmd with echo off,
REM This is necessary to prevent echoing of the piped input command to the output
REM The /k switch will cause cmd to suppress the startup banner and wait for input.
REM And finally pipe the exit command to new cmd session to terminate it immediately.
REM This way the only output of the cmd session is the Prompt value,
REM which is a single space char.
echo exit|"%SystemRoot%\system32\cmd.exe" /d /q /k>"OneByteSingleSpaceFile_PipeMethod.txt"
REM Alternate faster method which avoids using pipe
REM This method relays on the behavior of cmd that terminates immediately on nul input,
REM Just after showing the Prompt and waiting for command input.
"%SystemRoot%\system32\cmd.exe" /d /k>"OneByteSingleSpaceFile_NulInputMethod.txt" <nul
REM Note: To append a single space to an existing file, use >> for redirection.
endlocal
)