Как я могу использовать powershell для вызова SHGetKnownFolderPath?

Я полный нуб на Windows PowerShell. Как я могу использовать psl для вызова SHGetKnownFolderPath? Затем я хочу также вызвать SHSetKnownFolderPath, если мне не нравятся некоторые значения из вызова Get.

4 ответа

Решение

Вы можете использовать P/Invoke. У Ли Холмса есть пример того, как сделать это из PowerShell здесь. Там есть пример того, как использовать SHGetKnownFolderPoath здесь

В качестве альтернативы, вы можете просто использовать Environment.GetFolderPath:

PS> [Environment]::GetFolderPath('CommonApplicationData')
C:\ProgramData

Вы можете получить список доступных опций следующим образом:

PS> [Enum]::GetNames([Environment+SpecialFolder])

Вот функция, которую вы можете использовать, которая будет использовать 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.

Прежде чем углубляться в статические методы в Framework, посмотрите на переменные в Env:PSDrive,

get-childitem env:

(get-item env:\CommonProgramFiles).Value

В соответствии с этим учебник (и другие) параметры в реестре:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]

Их легко прочитать в Power Shell, используйте их как диск:

ps> cd hkcu:\Software\Microsoft\Windows\CurrentVersion\Explorer\
ps> dir

И используйте стандартные инструменты Power Shell, чтобы прочитать эти настройки.

ПРИМЕЧАНИЕ. Здесь вы можете установить их с помощью Power Shell, но это может испортить вам день.

Если вы используете проводник для изменения каталога, он также перемещает каталог и сохраняет настройки в нескольких местах, таких как "Папки пользовательской оболочки" и "Папки оболочки".

Другие вопросы по тегам