从 Windows 上下文菜单运行程序时忽略文件扩展名?

从 Windows 上下文菜单运行程序时忽略文件扩展名?

我在 Windows 上下文菜单中添加了“转换为 JPG”选项。我通过将上下文菜单设置为运行来实现此目的magick convert %1 %1.jpg。但是,虽然这可行,但它也会保留原始文件扩展名(因此 TestImage.png 变为 TestImage.png.jpg),但我想删除它(因此它只是变为 TestImage.jpg)。

据我所知,类似的东西%~n1只能在批处理脚本中的 FOR 块中起作用。

我能做些什么吗?或者我以错误的方式解决这个问题?

非常感谢。

答案1

使用

cmd /C for /F "delims=" %%G in ("%1") do magick convert "%~G" "%~nG.jpg"

或者

cmd /C for /F "delims=" %%G in ("%1") do magick convert "%~G" "%~dpnG.jpg"

前一行使用以下注册表破解进行了测试

reg query "HKEY_CLASSES_ROOT\pngfile\shell\ForLoop\Command"

HKEY_CLASSES_ROOT\pngfile\shell\ForLoop\Command
    (Default)    REG_SZ    cmd /C for /F "delims=" %%G in ("%1") do CliParserPause.exe convert "%~G" "%~nG.jpg"

并使用以下简单的 C++ 程序,列出所提供的所有命令行参数(然后暂停以便观察其输出):

// CliParserPause.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <wchar.h>
#include <cstdio>
#include <stdlib.h>

int main(int argc, wchar_t* argv[])
{
    for (int i = 0; i < argc; ++i)
    {
        wprintf(L"param %d = %S\n", i, argv[i]);
    }
    wprintf(L"press any key to continue...");
    std::getchar();
    exit(-999 - argc);  /* exitcode to OS = ( -1000 -supplied_paramaters_count ) */
    return 0;
}

测试用例输出

C:\WINDOWS\system32> CliParserPause.exe convert "D:\bat\SO\Loading1.png" "Loading1.jpg"
param 0 = CliParserPause.exe
param 1 = convert
param 2 = D:\bat\SO\Loading1.png
param 3 = Loading1.jpg
press any key to continue...

另一个测试用例显示了一些路径和文件名中带有空格的非平凡示例:

C:\WINDOWS\system32> CliParserPause.exe convert "D:\bat\odds and ends\a b\c d\e f\File Explorer Properties.png" "File Explorer Properties.jpg"
param 0 = CliParserPause.exe
param 1 = convert
param 2 = D:\bat\odds and ends\a b\c d\e f\File Explorer Properties.png
param 3 = File Explorer Properties.jpg
press any key to continue...

相关内容