gpt4 book ai didi

windows - Powershell 是否存在语言中立的文件系统对象动词?

转载 作者:可可西里 更新时间:2023-11-01 09:22:42 37 4
gpt4 key购买 nike

当我想使用 Powershell 固定文件夹到文件资源管理器的快速访问部分时,我会这样做

$folderPath = "C:\Windows"
$shell = New-Object -ComObject shell.application
$folder = $Shell.Namespace("$folderPath").Self
$verb = $folder.Verbs() | Where-Object {$_.Name.replace('&', '') -match 'Pin to Quick access'}
if ($verb) {
$verb.DoIt()
}

由于 Verb 名称匹配,如果此函数在非英语 Windows 上运行,则该函数将失败,Verb 名称取决于语言

我还发现这段代码似乎调用了类似于键而不是动词名称的东西,但如果操作系统语言不是英语,它也会失败。

$folder.InvokeVerb("pintohome")

是否有适用于任何语言版本的 Windows 的语言中性动词“键”?如果是,我在哪里可以找到它们?

最佳答案

简短的回答是“否”。

但如果您深入研究 Windows MUI 资源并在其中找到适合您的语言的动词,则可以解决这个问题。

不幸的是,此解决方法有其自身的缺点:这些资源对于每个 Windows 版本都是不同的。您可以在此处查看有关此解决方案的详细信息 http://alexweinberger.com/main/pinning-network-program-taskbar-programmatically-windows-10/

为了完整起见,从那里复制粘贴代码(仅适用于 Windows 7):

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
internal static extern IntPtr LoadLibrary(string lpLibFileName);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
internal static extern int LoadString(IntPtr hInstance, uint wID, StringBuilder lpBuffer, int nBufferMax);

public static bool PinUnpinTaskbar(string filePath, bool pin)
{
if (!File.Exists(filePath)) throw new FileNotFoundException(filePath);
int MAX_PATH = 255;
var actionIndex = pin ? 5386 : 5387; // 5386 is the DLL index for"Pin to Tas&kbar", ref. http://www.win7dll.info/shell32_dll.html
//uncomment the following line to pin to start instead
//actionIndex = pin ? 51201 : 51394;
StringBuilder szPinToStartLocalized = new StringBuilder(MAX_PATH);
IntPtr hShell32 = LoadLibrary("Shell32.dll");
LoadString(hShell32, (uint)actionIndex, szPinToStartLocalized, MAX_PATH);
string localizedVerb = szPinToStartLocalized.ToString();

string path = Path.GetDirectoryName(filePath);
string fileName = Path.GetFileName(filePath);

// create the shell application object
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
dynamic directory = shellApplication.NameSpace(path);
dynamic link = directory.ParseName(fileName);

dynamic verbs = link.Verbs();
for (int i = 0; i < verbs.Count(); i++)
{
dynamic verb = verbs.Item(i);
if (verb.Name.Equals(localizedVerb))
{
verb.DoIt();
return true;
}
}
return false;
}

关于windows - Powershell 是否存在语言中立的文件系统对象动词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738619/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com