4

我是windows powershell的菜鸟。如何使用 psl 调用 SHGetKnownFolderPath ?如果我不喜欢从 Get 调用返回的某些值,我还想调用 SHSetKnownFolderPath。

4

4 回答 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 回答