我正在寻找一种从 Windows 资源管理器中获取正确文件:/ URI 的方法。基本上,我希望有一个上下文菜单条目,上面写着“将文件 URI 复制到剪贴板”。有类似的东西吗?
这不是“将文件名复制到剪贴板”的重复,因为我想要的是文件 URI 而不是路径名。
需要澄清的是:我希望获取“file:///c:/Temp/foo%20bar.txt”,而不是“C:\Temp\foo bar.txt”,也不是“foo bar.txt”,也不是“C:\Temp”。
答案1
刚刚想到了这个 VBS。
If WScript.arguments.count > 0 Then
Dim WshShell: Set WshShell = WScript.CreateObject("Wscript.Shell")
strPath = "file:///" & Wscript.Arguments(0)
strPath = Replace(strPath,"\","/")
strPath = Replace(strPath," ","%20")
sCmd = "%comspec% /c<nul (set/p anyvariable=" & Chr(34) & strPath & Chr(34) & ")|clip.exe"
WshShell.Run sCmd,0,0
Set WshShell = Nothing
End If
将其保存为 .VBS 文件。将文件拖放到 VBScript 上,它会将文件的 URI 复制到剪贴板。如果需要,您可以在右键菜单中实现它。
它将文件名复制到内存中,反转斜线,用“%20”替换空格,并在开头附加“file:///”。这是一个基本脚本,仅支持一个文件名/参数。您可以根据需要对其进行修改。
将脚本添加到“发送到”文件夹
您可以将脚本的快捷方式放在“发送到”文件夹中。按WinKey+ R,键入shell:sendto
,然后按ENTER。在“发送到”文件夹中创建脚本的快捷方式并相应命名。(例如Copy File URI
)
现在,右键单击一个文件,单击发送到,然后单击Copy File URI
。文件路径将被复制到剪贴板,URI 格式如下。
file:///C:/Users/jack/desktop/list-of-items.txt
答案2
VBS 脚本很好,但它无法处理所有的边缘情况,就像UrlCreateFromPath或 .NET 的系统URI。
幸运的是,两者都很容易使用,以下是我所做的:
using System;
using System.Windows.Forms;
namespace AbsoluteUriGenerator
{
class Program
{
[STAThread]
static int Main(string[] args)
{
if (args.Length != 1)
{
var executableName = typeof(Program).Assembly.GetName().Name + ".exe";
Console.WriteLine("Usage: {0} pathToConvert", executableName);
Console.WriteLine("Example: {0} \"C:\\foo\"", executableName);
return 1;
}
var path = args[0];
Console.WriteLine("Resolving file:// URI of path: {0}", path);
var fileUri = new Uri(path).AbsoluteUri;
Console.WriteLine("Setting clipboard to resolved file:// URI: {0}", fileUri);
Clipboard.SetText(fileUri);
return 0;
}
}
}
您可以将其复制到您的shell:sendto
文件夹中,这是一个编译版本:https://1drv.ms/u/s!Aj2cMNVj29ben4B_mh9Md5R4ghBlMQ