DOS BATコマンド言語を使用してDOSファイル名のベース名(拡張子なしのファイル名)に到達する簡単な方法はありますか?
同意する: format c:\
はおそらく良いスタートであり、ブート可能なLinux CDが続きます(これらのアンティークマシンにはCDリーダーが搭載されていることを前提としています)。しかし、DOSのみを持っているふりをしましょう...
コマンドラインの場合
for /F %i in ("c:\foo\bar.txt") do @echo %~ni
出力:bar
.batファイルの場合
set FILE="c:\foo\bar.txt"
for /F %%i in ("%FILE%") do @echo %%~ni
出力:bar
追伸パスにスペースが含まれる場合、 @ cianticのバージョン を使用します。
(さらに読む: http://www.computerhope.com/forhlp.htm )
hobodave's および ars's の回答を展開するために、for
コマンドからの関連するヘルプスニペットを示します。
In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:
%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string
The modifiers can be combined to get compound results:
%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
environment variable for %I and expands to the
drive letter and path of the first one found.
%~ftzaI - expands %I to a DIR like output line
In the above examples %I and PATH can be replaced by other valid
values. The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.
Hobodaveから受け入れられた答えに基づいて、バッチファイルにコマンドを使用して変数を設定する方法を次に示します。
for /F %%i in ("%1") do @set FN=%%~nxi
最初のコマンドライン引数%1を使用し、変数FNをベース名(たとえば、file.txt)に設定します。
また、MKS Toolkitには、...
「できない」という答えだけでは十分ではないことを理解しています。そのため、リアルモードDOSで本当に/ has /を実行する場合は、4DOSコマンドシェルと付属プログラムを取得し、COMMAND.COMの代わりに使用します
http://www.4dos.info/v4dos.htm
私は何年も使用していませんが、COMMAND.COMよりも常に/ far /優れていました。このページを検索する場合: http://www.4dos.info/4batfaq.htm for "basename "COMMAND.COMの4DOS/instead /を使用している場合、問題に対するリアルモードDOSの回答があることがわかります。
私が考えることができる他の唯一のソリューションパスは、basenameを実行するリアルモードの.exeを見つけるか書き込むことです。
COMMAND.COMは、サポートするすべての外部コマンドを備えたDOS 6.22でも、スクリプト/バッチファイル用のシステムが常に非常に不自由でした。 MinGW32コマンドラインプログラムは役に立たないことに注意してください。これらはすべて保護モード(32ビットWindows)用です。 DOSで試してみると、「このプログラムはDOSモードで実行できません」という不可解なメッセージが表示されます。または類似のもの。
DOS 6.22は、バッチステートメントで%〜nI inをサポートしていません。 isql 2.10のbcheckユーティリティは引数としてstar.starを使用していましたが、ベースネームのみを必要とするisqlの4.10 bcheckユーティリティに関する最初の質問で提示した問題の回避策は次のとおりです。 bcheck 4.10を解決するために次のQBASICプログラムを作成し、ベース名のみが機能するようになりました。
BatFile$ = "CHKFILE.BAT"
IF INSTR(COMMAND$, "?") > 0 THEN
PRINT
PRINT "This program generates a batch file to check Informix files"
PRINT " -b BBBB.BAT this option is used to change the batch file name"
PRINT " by default the batch file name is CHKFILE.BAT"
PRINT
SYSTEM
END IF
IF INSTR(COMMAND$, "-B") > 0 THEN
BatFile$ = LTRIM$(MID$(COMMAND$, INSTR(COMMAND$, "-B") + 2)) + " "
BatFile$ = LEFT$(BatFile$, INSTR(BatFile$, " ") - 1)
END IF
OPEN BatFile$ FOR OUTPUT AS #2
filename$ = DIR$("*.dat")
IF LEN(filename$) = 0 THEN SYSTEM
DO WHILE LEN(filename$) > 0
PRINT #2, "bcheck -y", filename$
filename$ = DIR$
LOOP
CLOSE
SYSTEM
または、ACEプログラムを記述して、systables.dirpathからベース名を抽出し、PRINT "BCHECK -y"、systables.dirpathを作成できます。
[〜#〜] for [〜#〜] loopコマンドでは、%%~n
。
。batファイル
for /F "delims=" %%i in (%FILE_path%) do @echo "%%~ni"
incommand-Promptuse%
の代わりに%%
( @ Cianticに感謝 )