DOS BAT 文件相当于 Unix basename 命令?

发布于 2024-09-13 12:00:04 字数 242 浏览 12 评论 0原文

有没有一种简单的方法可以使用 DOS BAT 命令语言获取 DOS 文件名的基本名称(不带扩展名的文件名)?

我同意:format c:\ 可能是一个好的开始,然后是可启动的 Linux CD(假设这些古董机器有 CD 阅读器 - 不是给定的)。但让我们假设我们只有 DOS...(这意味着:没有 Windows - 甚至没有 Windows 3.1,更不用说 Windows 95、98、NT、ME、XP、Vista、7 等)

Is there an easy way to get to the basename (file name without extension) of a DOS file name using the DOS BAT command language?

I agree: format c:\ is probably a good start, followed by a bootable Linux CD (assuming these antique machines have a CD reader - not a given). But let's pretend that we only have DOS... (That means: not Windows - not even Windows 3.1, let alone Windows 95, 98, NT, ME, XP, Vista, 7, etc.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

深府石板幽径 2024-09-20 12:00:04

对于命令行

for /F %i in ("c:\foo\bar.txt") do @echo %~ni

对于.bat 文件

for /F %%i in ("c:\foo\bar.txt") do @echo %%~ni

输出: bar

如果路径包含空格,请添加"delims=" 像这样:

for /F "delims=" %i in ("c:\foo\bar baz.txt") do @echo %~ni

输出:bar baz

(进一步阅读:
http://www.computerhope.com/forhlp.htm )

For command-line

for /F %i in ("c:\foo\bar.txt") do @echo %~ni

For .bat Files

for /F %%i in ("c:\foo\bar.txt") do @echo %%~ni

output: bar

If the path contains a space, add in "delims=" like so:

for /F "delims=" %i in ("c:\foo\bar baz.txt") do @echo %~ni

output: bar baz

(Further Reading:
http://www.computerhope.com/forhlp.htm )

南汐寒笙箫 2024-09-20 12:00:04

扩展 hobodavears的答案,这是来自的相关帮助片段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.

To expand on hobodave's and ars's answers, here's the relevant snippet of help from the for command:

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.
青衫儰鉨ミ守葔 2024-09-20 12:00:04

我明白“你不能”的答案还不够好。因此,如果确实/必须/在实模式 DOS 中完成,则获取 4DOS 命令 shell 和随附程序并使用它而不是 COMMAND.COM

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

我已经很多年没有使用它了,但它总是/远远/比 COMMAND.COM 如果你搜索这个页:
http://www.4dos.info/4batfaq.htm
对于“basename”,如果使用 COMMAND.COM 的 4DOS /instead/,您将看到有一个实模式 DOS 答案来解决您的问题。

我能想到的唯一其他解决方案路径是查找或编写执行 basename 的实模式 .exe。

COMMAND.COM,即使在 DOS 6.22 及其所有支持的外部命令中,对于脚本/批处理文件来说始终是一个极其严重的系统。请注意,MinGW32 命令行程序没有任何帮助。所有这些内容都是针对保护模式(32 位 Windows)的。如果您在 DOS 下尝试,您只会得到神秘的“此程序无法在 DOS 模式下运行”。或类似的东西。

I understand that the answer "you can't" is not good enough. So, if it really /has/ to be done in Real Mode DOS, then get the 4DOS command shell and accompanying programs and use it instead of COMMAND.COM

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

I haven't used it in years, but it was always /far/ better than COMMAND.COM If you search this page:
http://www.4dos.info/4batfaq.htm
for "basename" you will see there is a Real Mode DOS answer to your problem if using 4DOS /instead/ of COMMAND.COM

The only other solution path I can think of is to find or write a Real Mode .exe that performs basename.

COMMAND.COM, even in DOS 6.22 with all its supporting external commands, was always an incredibly crippled system for scripts/batch files. Note that the MinGW32 command line progs will be of no help. All that stuff is for Protected Mode (32 bit Windows). If you try it in DOS you'll just get the cryptic "This program cannot be run in DOS mode." or something similar.

你列表最软的妹 2024-09-20 12:00:04

完整工作解决方案(即使路径包含空格)

.bat 文件中的

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

命令提示符中的 使用 % 代替%%

(感谢@Ciantic

Full-working solution (even when path contains spaces)

in .bat files

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

in command-prompt use % instead of %%

(thanks to @Ciantic)

塔塔猫 2024-09-20 12:00:04

DOS 6.22 不支持 for 批处理语句中的 %~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 程序来从 systables.dirpath 中提取基本名称并打印“BCHECK -y”,systables.dirpath

DOS 6.22 does not support %~nI in for batch statements. here's a workaround to the problem I presented in my original question about isql's 4.10 bcheck utility requiring only a basename whereas in isql 2.10 bcheck utility worked with star.star as an argument. I created the following QBASIC program to solve bcheck 4.10 now requiring only a basename to work:

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

OR, one can write an ACE program to extract the basename from systables.dirpath and PRINT "BCHECK -y ",systables.dirpath

呆头 2024-09-20 12:00:04

根据 hobodave 接受的答案,这里介绍了如何使用该命令在批处理文件中设置变量:

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

它使用第一个命令行参数 %1,并将变量 FN 设置为等于基本名称(例如 file.txt) 。

Based on the accepted answer from hobodave here is how you can use the command to set a variable in a batch file:

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

It uses the first command line argument %1, and sets the variable FN equal to the basename (file.txt for example).

混吃等死 2024-09-20 12:00:04

FOR循环命令中,可以使用%%~n

In the FOR loop command, you can use %%~n.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文