Подтвердить что ты не робот

Файл DOS BAT эквивалентен команде basename Unix?

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

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

4b9b3361

Ответ 1

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

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

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

(Дальнейшее чтение: http://www.computerhope.com/forhlp.htm)

Ответ 2

Чтобы перейти на 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.

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

DOS 6.22 не поддерживает% ~ nI для пакетных операторов. здесь обходной путь к проблеме, которую я представил в моем первоначальном вопросе об утилите isql 4.10 bcheck, которая требует только базового имени, тогда как в isql 2.10 утилита bcheck работала с star.star в качестве аргумента. Я создал следующую 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 для извлечения basename из systables.dirpath и PRINT "BCHECK -y", systables.dirpath

Ответ 7

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

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

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

Ответ 8

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

в файлах .bat

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

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

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