6

WindowsとXPの両方で%tab%(1つのタブ文字を含む)を作成する信頼できる方法が必要です。

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

WinXPでのみ機能します。

4

11 に答える 11

10

スペースに変更せずにTAB文字をサポートするエディターを使用する必要があります。また、3文字の変数を取得した場合と
同様に、引用符を並べ替える必要があります。 TABには引用符も含まれています。set 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はWindowsXPでは使用できません。

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ヘッダーが、NT3.1の時代のほぼ25年前から、Windows10の時代の今日まで同じままであったという事実を利用しています。

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文字が必要な場合は、プロンプトテクニックを使用しますが、この方法はエコーに比べて非常に遅いため、過度に使用しないでください。

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れるため、行からタブ文字を切り取るには、もう1つのコマンドが必要になります。次に例を示します。

    @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

このDosTipsトピックで説明されているように、あいまいなforfilesコマンドを使用(または悪用?)して、タブ文字(またはNUL以外の任意の文字)を生成できます。

ここに一言で言えば:

@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

ただし、WindowsVista以降forfilesでのみ使用できます。でも元気を出して、私の小さなXPバニー!素晴らしいWaybackMachineのおかげで、 forfiles.zip ( 22.1kb )の化石化したコピーをダウンロードできます。

于 2018-01-06T15:13:43.380 に答える
2

以下の:makeTabサブルーチンはタブ文字を作成し、渡された変数の名前でそれを格納します。が必要です。これは、 WindowsXPcertutilの一部のバージョンにはインストールされていません。

@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を除いて)任意の文字を生成するように簡単に拡張できます。ASCII128とASCII255の間の文字に関するコードページの問題に注意してください。

于 2018-01-05T22:31:53.280 に答える
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またはすべてのロケールで機能することは保証されていません。英語版のWindows7HP 32ビットで上記のテストに成功しましたが、ymmvです。

于 2018-01-10T17:24:19.360 に答える
1

私は最後まで最善を尽くしました!;)

jebなどの権威と矛盾するのは気が進まないので、彼の答えは5年以上前のものであり、XP以降のすべてのバージョンのWindowsで機能するネイティブバッチコマンドのみを使用してタブ文字を作成する手法が開発た。

以下のサブルーチンは、 DosTipsのマラソン「すべてのASCII文字の作成」トピックで:makeTab開発されたコードに基づいています。タブ文字(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を除いて)任意の文字を作成するように簡単に変更できます。ASCII128と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

方法2

必要に応じて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

Win10cmdでテスト済み

于 2021-10-14T06:54:37.977 に答える
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 に答える