我需要可靠的方法来为 Windows 和 XP 创建 %tab% (包含一个制表符)。
SET TAB=" "
应该适用于 Windows 7(未测试),但不适用于 Win XP(已测试)。
这个
for /F "skip=4 delims=pR tokens=1,2" %%a in ( 'reg query hkcu\environment /v temp' ) do set TAB=%%b
仅适用于 Win XP。
我需要可靠的方法来为 Windows 和 XP 创建 %tab% (包含一个制表符)。
SET TAB=" "
应该适用于 Windows 7(未测试),但不适用于 Win XP(已测试)。
这个
for /F "skip=4 delims=pR tokens=1,2" %%a in ( 'reg query hkcu\environment /v temp' ) do set TAB=%%b
仅适用于 Win XP。
您应该使用支持 TAB 字符而不将它们更改为空格的编辑器。
你应该重新排序引号,因为set TAB=" "
你有一个包含三个字符的变量。
TAB 还包含引号。
set "TAB= "
目前似乎没有可靠的方法来使用程序在所有语言平台上的所有 Windows 版本中创建 TAB 字符。
但您也可以使用嵌入式 Jscript 片段。
@if (@X)==(@Y) @goto :Dummy @end/* Batch part
@echo off
SETLOCAL ENABLEEXTENSIONS
for /f "delims=" %%x in ('cscript //E:JScript //nologo "%~f0"') do set TAB=%%x
echo Tab character is "%tab%"
goto :EOF
***** Now JScript begins *****/
WScript.Echo(String.fromCharCode(9));
使用 robocopy 也可以生成 TAB。默认情况下,Robocopy 在 windows xp 中不可用。
for /f "delims= " %%T in ('robocopy /L . . /njh /njs') do set "TAB=%%T"
此方法在 Win2k、WinXP、Vista、Win7、Win8、Win10 上普遍适用
它利用了Microsoft 编译器工具集生成的PE可执行映像的MZ标头从近 25 年前的 NT3.1 时代到今天的 Windows 10 时代保持不变的事实。
MZ 标头的偏移量 0x46 处的字节值是 0x09,它是TAB字符所以从 Windows 中选择任何可执行文件并从中获取 TAB 就足够了。
最方便和合乎逻辑的选择是使用命令处理器本身的可执行文件。
@echo off
setlocal EnableExtensions
set "TAB="
for /F "delims=" %%Z in (
'^(type "%COMSPEC%"^|^(^(for /L %%P in ^(1^,1^,70^) do @pause^>nul^)^&set /p "TAB="^&call echo^,%%TAB%%^)^)2^>nul'
) do set "TAB=%%Z"
set "TAB=%TAB:~0,1%"
echo,
echo TAB---^>[%TAB%]^<---TAB SPACE---^>[ ]^<---SPACE EMPTY---^>[]^<---EMPTY
echo,
pause
更新 2018 年 4 月 23 日
这是一种替代且更易于理解的语法,它避免使用管道并且比上面的要快得多
((for /L %%P in (1,1,70) do pause>nul)&set /p "TAB=")<"%COMSPEC%"
set "TAB=%TAB:~0,1%"
/更新
要回显 TAB,请使用以下表格:
echo,%TAB%
要将 TAB 字符写入文件:
:: Creates a new file with TAB character
echo,%TAB%>"NewFile.txt"
:: Appends the TAB character to end of the existing file
echo,%TAB%>>"ExistingFile.txt"
请注意,echo将始终在末尾附加一个新行 (CRLF)。如果您只想要不带换行符的 TAB 字符,请使用提示技术,但请记住,与 echo 相比,此方法非常慢,因此不要过度使用
setlocal
set "prompt=%TAB%"
"%COMSPEC%" /d /k<nul>"TAB_Without_NewLine.txt"
endlocal
将制表符合并到批处理文件中。特别是,把它放在第一行,前面@ECHO OFF
,然后用命令读取第一行SET /P
。当然,它会读取整行,因此SET
需要另外一个命令来从行中删除制表符。这是一个例子:
@ECHO OFF
<%0 SET /p tab=
SET tab=%tab:~0,1%
ECHO Every%tab%word%tab%is%tab%tabulated
请注意,@ECHO OFF
这里前面的空格应该是单个制表符,就像我之前所说的那样。
obscureforfiles
命令可用于(或滥用?)生成制表符(或您喜欢的任何其他字符,NUL 除外),如本DosTips 主题中所述。
简而言之:
@echo off & setLocal enableExtensions disableDelayedExpansion
for /f "delims= " %%T in ('
forFiles /p "." /m "%~nx0" /c "cmd /c echo(0x09"
') do set "tab=%%T"
echo(words%tab%separated%tab%by%tab%tabs
endLocal & goto :EOF
但是,forfiles
仅适用于Windows Vista及更高版本。但是振作起来,我的XP小兔子们!感谢奇妙的Wayback Machine ,您可以下载forfiles.zip (22.1kb)的化石副本。
下面的:makeTab
子例程创建一个制表符并将其存储在传递给它的变量的名称中。Requires ,在某些版本的Windows XPcertutil
上未安装。
@echo off & setLocal enableExtensions disableDelayedExpansion
call :makeTab tab
echo(words%tab%separated%tab%by%tab%tabs
endLocal & goto :EOF
:makeTab result=
:: returns tab char in var name given as param
:: requires certUtil
setLocal
set "tabFile=%tmp%\tab.tmp"
if not exist "%tabFile%" (
>"%tabFile%" echo(09
certUtil -decodeHex -f "%tabFile%" "%tabFile%" >nul
) %= if =%
for /f "useBack delims=" %%T in ("%tabFile%") do (
endLocal & set "%1=%%T"
) %= for /f =%
exit /b 0 %= makeTab =%
PS:想想看,上面的子程序可以很容易地扩展来生成你想要的任何字符(除了 NUL)。注意 ASCII 128 和 ASCII 255 之间的字符的代码页问题。
我把最好的留到最后!;)
尽管我不愿与jeb这样的权威相矛盾,但他的回答已经超过 5 年了,并且已经开发出一种技术来仅使用本机批处理命令来创建制表符字符,该技术适用于从XP开始的所有Windows版本。
下面的:makeTab
子例程基于在DosTips上的马拉松创建所有 ASCII 字符主题中开发的代码。它用于创建制表符(ASCII 9)并将其存储为变量,并将名称作为参数传递给它:makecab
@echo off & setLocal enableExtensions disableDelayedExpansion
call :makeTab tab
echo(words%tab%separated%tab%by%tab%tabs
endLocal & goto :EOF
:makeTab result=
:: returns tab char in var name given as param
:: based on http://consolesoft.com/batch/binary/genchr.cmd
setLocal
set "tabFile=%tmp%\tab.tmp"
if not exist "%tabFile%" (goto makeTabFile) else goto readTabFile
:makeTabFile
type nul >"%tabFile%"
makeCab /d compress=off /d reservePerDataBlockSize=0 ^
/d reservePerFolderSize=9 "%tabFile%" "%tabFile%" >nul
for /f "skip=28 delims=" %%F in ('find /v "" "%tabFile%"') do (
>"%tabFile%" echo(%%F
goto readTabFile
) %= for /f =%
:readTabFile
for /f "useBack delims= " %%T in ("%tabFile%") do (
endLocal & set "%1=%%T"
) %= for /f =%
exit /b 0 %= makeTab =%
只要您知道所需字符的 ASCII 代码,就可以轻松地修改子例程以创建您喜欢的任何字符(NUL 除外)。注意 ASCII 128 和 255 之间的代码页问题。
没有必要“使用支持 TAB 字符而不将它们更改为空格的编辑器”。
从命令行:
方法1 -forfiles
echo la >t
forfiles /m "t" /c "cmd /c set /p=j0x09"<nul> tab
Copy /y tab+Nul t
type t | ((for /l %N in (1 1 3) do pause)>nul&findstr "^") > t
copy /y t /A tab /B
方法二
如果你喜欢certutil
:
set /p=09<nul> t
certutil -decodehex t tab
方法3: -fsutil
echo la >t
forfiles /m "t" /c "cmd /c set /p=j0x09"<nul> tab
((for /l %N in (1 1 3) do pause)>nul&findstr "^") <tab> t
fsutil file seteof t 1 >nul
在 Win 10 cmd 上测试
DosTips用户 aGerman于 2011 年首次报告输出中存在制表符,而jeb去年 5 月改进了提取它的技术,如下所示:shutdown /?
@echo off & setLocal enableExtensions disableDelayedExpansion
for /f "delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 " %%T in ('
shutDown /?
') do set "tab=%%T"
set "tab=%tab:~0,1%"
echo(words%tab%separated%tab%by%tab%tabs
endLocal & goto :EOF
警告:不保证适用于所有版本的Windows或所有语言环境。我在我的英文版Windows 7 HP 32 位上成功测试了上述内容,但是 ymmv。
我的解决方案很简单:
set TAB= "
set "TAB=%TAB:"=%
echo one!TAB!two!TAB!three
一二三
感谢您的回答。
最后我使用了这个简单的方法:
FOR /f "delims=" %%x IN (delimiter.ini) DO set TAB=%%x