我是windows powershell的菜鸟。如何使用 psl 调用 SHGetKnownFolderPath ?如果我不喜欢从 Get 调用返回的某些值,我还想调用 SHSetKnownFolderPath。
问问题
2777 次
4 回答
9
您可以使用 P/Invoke。Lee Holmes在此处提供了如何从 PowerShell 执行此操作的示例。SHGetKnownFolderPoath
这里有一个如何使用的例子。
或者,您也许可以使用Environment.GetFolderPath
:
PS> [Environment]::GetFolderPath('CommonApplicationData')
C:\ProgramData
您可以通过以下方式获取可用选项的列表:
PS> [Enum]::GetNames([Environment+SpecialFolder])
于 2013-05-20T20:51:02.963 回答
0
在深入研究框架中的静态方法之前,请查看Env:
PSDrive
.
get-childitem env:
(get-item env:\CommonProgramFiles).Value
于 2013-05-21T00:33:30.693 回答
0
这是您可以使用的函数,它将使用 SHGetKnownFolderPath 将众所周知的文件夹 guid 转换为其当前路径:
Function GetKnownFolder([string]$KnownFolderCLSID) {
$KnownFolderCLSID = $KnownFolderCLSID.Replace("{", "").Replace("}", "")
$GetSignature = @'
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]public extern static int SHGetKnownFolderPath(
ref Guid folderId,
uint flags,
IntPtr token,
out IntPtr pszProfilePath);
'@
$GetType = Add-Type -MemberDefinition $GetSignature -Name 'GetKnownFolders' -Namespace 'SHGetKnownFolderPath' -Using "System.Text" -PassThru -ErrorAction SilentlyContinue
$ptr = [intptr]::Zero
[void]$GetType::SHGetKnownFolderPath([Ref]"$KnownFolderCLSID", 0, 0, [ref]$ptr)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($ptr)
[System.Runtime.InteropServices.Marshal]::FreeCoTaskMem($ptr)
return $result
}
使用示例:
GetKnownFolder "C4AA340D-F20F-4863-AFEF-F87EF2E6BA25"
将返回
C:\Users\Public\Desktop
众所周知的文件夹 GUID 的参考可以在Microsoft找到
于 2021-06-22T10:49:42.147 回答
0
根据本教程(和其他),设置在注册表中:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]
这些在powershell中很容易阅读,将它们作为驱动器访问:
ps> cd hkcu:\Software\Microsoft\Windows\CurrentVersion\Explorer\
ps> dir
并使用标准的powershell工具来读取这些设置。
注意:您可以在此处使用 powershell 设置它们,但这可能会毁了您的一天。
如果您使用资源管理器更改目录,它还会移动目录并将设置存储在多个位置,例如“用户外壳文件夹”和“外壳文件夹”。
于 2020-05-19T15:56:56.837 回答