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でのみ機能します。
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でのみ機能します。
スペースに変更せずに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));
robocopyを使用すると、TABも生成できます。デフォルトでは、RobocopyはWindowsXPでは使用できません。
for /f "delims= " %%T in ('robocopy /L . . /njh /njs') do set "TAB=%%T"
この方法は、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
タブ文字をバッチファイルに組み込みます。特に、最初の行の前に配置@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
に述べたように、単一のタブ文字であると想定されていることに注意してください。
この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 )の化石化したコピーをダウンロードできます。
以下の: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の間の文字に関するコードページの問題に注意してください。
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です。
私は最後まで最善を尽くしました!;)
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の間のコードページの問題に注意してください。
「スペースに変更せずに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でテスト済み
私の解決策は非常に簡単です:
set TAB= "
set "TAB=%TAB:"=%
echo one!TAB!two!TAB!three
一二三
回答ありがとうございます。
最後に、この簡単な方法を使用しました。
FOR /f "delims=" %%x IN (delimiter.ini) DO set TAB=%%x