批处理文件适用于 Windows Vista;结果“未找到文件”在 Windows 7 上

发布于 2024-09-10 01:27:27 字数 313 浏览 4 评论 0原文

以下批处理文件旨在解析目录并将每个文件发送到指定的程序,适用于 Windows Vista x64:

@ECHO OFF

FOR /F "tokens=1,2 delims=." %%A IN ('dir /b /on *.mts') DO (
    "C:\Program Files (x86)\DGAVCDecode\DGAVCIndex.exe" -i %%A.%%B -o %%~nA.dga -f 2 -a -e
)

在 Windows 7 x64 中,cmd 返回“未找到文件”— 无论是作为普通用户还是管理员。这是怎么回事?

The following batch file, meant to parse a directory and send each file to the specified program, works in Windows Vista x64:

@ECHO OFF

FOR /F "tokens=1,2 delims=." %%A IN ('dir /b /on *.mts') DO (
    "C:\Program Files (x86)\DGAVCDecode\DGAVCIndex.exe" -i %%A.%%B -o %%~nA.dga -f 2 -a -e
)

In Windows 7 x64, cmd returns "File Not Found"—both as a normal user and Administrator. What's going on?

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

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

发布评论

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

评论(5

思念满溢 2024-09-17 01:27:27

您可能想使用 %PROGRAMFILES% 而不是将“c:\program files”硬编码到批处理文件中。对于 64 位 Windows,还有 %PROGRAMFILES(x86)% 指向 32 位程序文件目录。

You might want to use %PROGRAMFILES% instead of hard coding "c:\program files" into your batch file. For 64bit windows, there's also %PROGRAMFILES(x86)% which points to the 32bit program files directory.

夏尔 2024-09-17 01:27:27

我在您的代码中看到以下问题:

  1. 看起来您使用 tokens=1,2 delims=. 将文件名按点拆分为基本名称和扩展名,然后将它们连接回来%%A.%%B。这不适用于包含点的文件名,因为它仅捕获文件名中的前两个标记。例如,给定文件名 foo.bar.mts%%A.%%B 将扩展为 foo.bar

    此外,实际上并不需要这种拆分/连接。如果您使用不带任何解析选项的循环,则文件名将存储在循环变量中,以便您可以简单地使用该变量而不是 %%A.%%B

  2. 您需要将传递给 DGAVCIndex.exe 的文件名括在引号中,以防它们包含空格。

    您需要将

  3. 另外,我第二个Larry 建议 使用 %PROGRAMFILES(x86)% 而不是 C:\Program Files (x86) - 这永远不会有坏处使用预定义的环境变量而不是硬编码标准系统路径。

所以,你的代码应该是这样的:

@echo off

for %%f in (*.mts) do (
  "%ProgramFiles(X86)%\DGAVCDecode\DGAVCIndex.exe" -i "%%~f" -o "%%~nf.dga" -f 2 -a -e
)

I see the following problems in your code:

  1. Looks like you use tokens=1,2 delims=. to split the file name by dot into the base name and extension and then join them back as %%A.%%B. This won't work with file names that contain dots, because it captures only the first two tokens from the file name. For example, given the file name foo.bar.mts, %%A.%%B will expand to foo.bar.

    Moreover, this split/join isn't actually needed. If you use the loop without any parsing options, the file name is stored in the loop variable so that you can simply use that variable instead of %%A.%%B.

  2. You need to enclose the file names passed to DGAVCIndex.exe in quotes, in case they contain spaces.

  3. Also, I second Larry's suggestion to use %PROGRAMFILES(x86)% instead of C:\Program Files (x86) — it never hurts to use predefined environment variables instead of hard-coding standard system paths.

So, your code should look like this:

@echo off

for %%f in (*.mts) do (
  "%ProgramFiles(X86)%\DGAVCDecode\DGAVCIndex.exe" -i "%%~f" -o "%%~nf.dga" -f 2 -a -e
)
甚是思念 2024-09-17 01:27:27

这似乎是显而易见的,但是 DGAVCIndex.exe 是否存在于 Win7 计算机上的指定位置?

This might seem obvious, but does DGAVCIndex.exe exist on the Win7 machine at the specified location?

北风几吹夏 2024-09-17 01:27:27

您确定 Windows 7 的 32 位和 64 位版本的文件夹名称正确吗?您是否检查了批处理文件是否存在于您在 bat 文件中提到的位置。

Are you sure the folder names are correct with respect to the 32 bit and 64 bit versions of Windows 7. Did you check whether your batch file exists in the location that you have mentioned in the bat file.

Saygoodbye 2024-09-17 01:27:27

资源管理器模仿一些目录,如“C:\Program Files”和“C:\Users”。当您使用本地化的 Windows 7 时,目录仍具有相同的名称,但资源管理器会显示本地化的内容,例如“C:\Programme”或“C:\Bemutzer”。

不要相信资源管理器使用命令行将文件复制到您要指定的位置。

Explorer mimics some directories like "C:\Program Files" and "C:\Users". When you use a localized windows 7, the directories have still the same name, but Explorer displays something localized like "C:\Programme" or "C:\Bemutzer".

Dont trust Explorer use the command line for copying files on a location you want to specify.

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