6

我需要可靠的方法来为 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。

4

11 回答 11

10

您应该使用支持 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));
于 2012-06-04T10:13:35.357 回答
4

使用 robocopy 也可以生成 TAB。默认情况下,Robocopy 在 windows xp 中不可用。

for /f "delims= " %%T in ('robocopy /L . . /njh /njs') do set "TAB=%%T"
于 2018-01-06T15:44:25.667 回答
4

此方法在 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
于 2018-04-21T18:54:07.113 回答
3

将制表符合并到批处理文件中。特别是,把它放在第一行,前面@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这里前面的空格应该是单个制表符,就像我之前所说的那样。

于 2012-06-04T09:49:43.520 回答
3

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)的化石副本。

于 2018-01-06T15:13:43.380 回答
2

下面的: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 之间的字符的代码页问题。

于 2018-01-05T22:31:53.280 回答
1

我把最好的留到最后!;)

尽管我不愿与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 之间的代码页问题。

于 2018-01-15T23:12:26.310 回答
1

没有必要“使用支持 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 上测试

于 2021-10-14T06:54:37.977 回答
1

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。

于 2018-01-10T17:24:19.360 回答
0

我的解决方案很简单:

set TAB=    "
set "TAB=%TAB:"=%

echo one!TAB!two!TAB!three

一二三

于 2020-03-17T21:01:44.413 回答
-1

感谢您的回答。

最后我使用了这个简单的方法:

FOR /f "delims=" %%x IN (delimiter.ini) DO set TAB=%%x
于 2012-06-06T04:39:45.020 回答