web-dev-qa-db-ja.com

Unix basenameコマンドに相当するDOS BATファイル?

DOS BATコマンド言語を使用してDOSファイル名のベース名(拡張子なしのファイル名)に到達する簡単な方法はありますか?

同意する: format c:\はおそらく良いスタートであり、ブート可能なLinux CDが続きます(これらのアンティークマシンにはCDリーダーが搭載されていることを前提としています)。しかし、DOSのみを持っているふりをしましょう...

36

コマンドラインの場合

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

45
hobodave

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.
30
Michael Burr

Hobodaveから受け入れられた答えに基づいて、バッチファイルにコマンドを使用して変数を設定する方法を次に示します。

for /F %%i in ("%1") do @set FN=%%~nxi

最初のコマンドライン引数%1を使用し、変数FNをベース名(たとえば、file.txt)に設定します。

3
Matthew Beckler
3
shawndumas

「できない」という答えだけでは十分ではないことを理解しています。そのため、リアルモード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モードで実行できません」という不可解なメッセージが表示されます。または類似のもの。

3
WyrdestGeek

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を作成できます。

2
Frank R.

[〜#〜] for [〜#〜] loopコマンドでは、%%~n

2
ars

完全に機能するソリューション(パスにスペースが含まれる場合でも)

。batファイル

for /F "delims=" %%i in (%FILE_path%) do @echo "%%~ni"

incommand-Promptuse%の代わりに%%

@ Cianticに感謝

0
T.Todua