我在 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...