Как я могу использовать 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, но это может испортить вам день.
Если вы используете проводник для изменения каталога, он также перемещает каталог и сохраняет настройки в нескольких местах, таких как "Папки пользовательской оболочки" и "Папки оболочки".