Файл DOS BAT эквивалентен команде Unix basename? - PullRequest
36 голосов
/ 08 августа 2010

Есть ли простой способ получить базовое имя (имя файла без расширения) имени файла DOS, используя язык команд DOS BAT?

Я согласен: format c:\, вероятно, хорошее начало, а затемс помощью загрузочного компакт-диска Linux (при условии, что на этих старинных компьютерах есть устройство для чтения компакт-дисков - не дано).Но давайте представим, что у нас есть только DOS ... (Это означает: не Windows - даже не Windows 3.1, не говоря уже о Windows 95, 98, NT, ME, XP, Vista, 7 и т. Д.)

Ответы [ 8 ]

45 голосов
/ 08 августа 2010

Для командной строки

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

ps, если путь содержит пробел , используйте @ версию ciantic .

(Дополнительная литература: http://www.computerhope.com/forhlp.htm)

30 голосов
/ 08 августа 2010

Чтобы развернуть ответы hobodave и ars , вот соответствующий фрагмент справки из команды 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.
3 голосов
/ 19 ноября 2014

На основе принятого ответа от hobodave, вот как вы можете использовать команду для установки переменной в пакетном файле:

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

Использует первый аргумент командной строки% 1 и устанавливает переменнуюFN равен базовому имени (например, file.txt).

3 голосов
/ 18 ноября 2011

Я понимаю, что ответ "ты не можешь" недостаточно хорош. Итак, если это действительно / должно / должно быть сделано в реальном режиме DOS, то получите командную оболочку 4DOS и сопутствующие программы и используйте ее вместо COMMAND.COM

http://www.4dos.info/v4dos.htm

Я не использовал его годами, но он всегда был / намного / лучше чем COMMAND.COM. Если вы ищете эту страницу: http://www.4dos.info/4batfaq.htm для "basename" вы увидите ответ DOS реального режима на вашу проблему, если вы используете 4DOS / вместо / COMMAND.COM

Единственный другой путь решения, который я могу придумать, - это найти или записать Real Mode .exe, который выполняет базовое имя.

COMMAND.COM, даже в DOS 6.22 со всеми поддерживающими его внешними командами, всегда была невероятно ограниченной системой для скриптов / пакетных файлов. Обратите внимание, что проги командной строки MinGW32 не помогут. Все это для защищенного режима (32-битная Windows). Если вы попробуете это в DOS, вы получите загадочное «Эта программа не может быть запущена в режиме DOS». или что-то подобное.

3 голосов
/ 08 августа 2010

Кроме того, MKS Toolkit имеет базовое имя util ...

http://www.mkssoftware.com/docs/man1/basename.1.asp

2 голосов
/ 25 декабря 2010

DOS 6.22 не поддерживает% ~ nI для пакетных операторов. Вот обходной путь к проблеме, которую я представил в своем первоначальном вопросе о утилите bcheck isql 4.10, требующей только базовое имя, тогда как в isql 2.10 утилита bcheck работала со звездой. Я создал следующую программу QBASIC для решения bcheck 4.10, теперь для работы требуется только базовое имя:

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 и ПЕЧАТЬ "BCHECK -y", systables.dirpath

2 голосов
/ 08 августа 2010

В команде цикла FOR вы можете использовать %%~n.

0 голосов
/ 25 ноября 2017

Полностью рабочее решение (даже если путь содержит пробелы)

в .bat файлы

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

в командная строка использовать % вместо %%

( благодаря @ Ciantic )

...