Невозможно указать путь к файлу в элементе реестра в powershell - HKCU PSDrive

Первый пост здесь!

Я новичок в powershell и пытаюсь написать несколько скриптов.

В настоящее время я пытаюсь написать сценарий powershell (PSVersion 5.1.15063.502) для поиска в реестре в Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders, чтобы найти любые записи, указывающие на указанный путь к файлу. Так что я могу изменить их, если потребуется. Использование функции Set-ItemProperty.

В идеале я хотел бы выполнить поиск в части «Данные» папок оболочки пользователя (см. рисунок).

Теперь, когда я запускаю функцию Get-ItemProperty, я получаю вывод папок, например:

PS C:\WINDOWS\system32> Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"


*AppData                                : C:\Users\RD\AppData\Roaming
Cache                                  : C:\Users\RD\AppData\Local\Microsoft\Windows\INetCache
Cookies                                : C:\Users\RD\AppData\Local\Microsoft\Windows\INetCookies
Desktop                                : C:\Users\RD\Desktop
Favorites                              : C:\Users\RD\Favorites
History                                : C:\Users\RD\AppData\Local\Microsoft\Windows\History
Local AppData                          : C:\Users\RD\AppData\Local
My Music                               : C:\Users\RD\Music
My Pictures                            : C:\Users\RD\Pictures
My Video                               : C:\Users\RD\Videos
NetHood                                : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Network Shortcuts
Personal                               : C:\Users\RD\Documents
PrintHood                              : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
Programs                               : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Recent                                 : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Recent
SendTo                                 : C:\Users\RD\AppData\Roaming\Microsoft\Windows\SendTo
Start Menu                             : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Start Menu
Startup                                : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Templates                              : C:\Users\RD\AppData\Roaming\Microsoft\Windows\Templates
{374DE290-123F-4565-9164-39C4925E467B} : C:\Users\RD\Downloads
PSPath                                 : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
PSParentPath                           : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
PSChildName                            : User Shell Folders
PSDrive                                : HKCU
PSProvider                             : Microsoft.PowerShell.Core\Registry*

Моя проблема, похоже, заключается в том, как я пытаюсь передать эту функцию, чтобы обеспечить вывод для элемента, указанного как «*Appdata\».

Я пробовал следующее, но не получил результата:

Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" | Where { $_.Data -eq "*AppData\*"}

Я уверен, что делаю основную ошибку здесь, но просто не могу понять это.

Я также пробовал Get-ChildItem на этом:

Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\ |
 Where { $_.Name -like "*User Shell Folders*" } | Select Property | Where { $_.Property -like "*Appdata*" } | Format-Wide

Но не получите правильный вывод просто: {AppData, Cache, Cookies, Desktop...}

Я могу получить вывод аналогичного скрипта, глядя на жесткий диск:

PS C:\WINDOWS\system32> Get-ItemProperty -Path "C:\Users\RD\Documents" | Where { $_.Name -like "*Documents"}


    Directory: C:\Users\RD


Mode                LastWriteTime         Length Name                                                                                                                                                      
----                -------------         ------ ----                                                                                                                                                      
d-r---       26/08/2017     13:00                Documents 

Может быть, это из-за различий в параметрах PSDrive? Любые советы будут оценены по достоинству.


person RD2017    schedule 26.08.2017    source источник
comment
Вы сказали, что только начинаете, вы знаете, как использовать |Get-member ?   -  person Adil Hindistan    schedule 26.08.2017
comment
Вместо того, чтобы дать вам сценарий, который будет делать именно так, как вы это сделаете, я опубликовал способ, которым я собираюсь найти, что делать.   -  person Adil Hindistan    schedule 26.08.2017


Ответы (1)


Я постараюсь дать вам несколько советов, так как это, кажется, то, что вы ищете. Конкретно об этом:

... чтобы найти любые записи, указывающие на указанный путь к файлу

Когда вы использовали Get-ItemProperty в пути к реестру, вы возвращали настраиваемый объект из PowerShell, который устанавливает имена на снимке экрана в NoteProperty, а значения реестра (данные, на которые вы указали) в качестве значений для этих свойств примечания. Вы можете легко убедиться в этом:

    PS C:\> Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"| Get-member


   TypeName: System.Management.Automation.PSCustomObject

Name                                   MemberType   Definition
----                                   ----------   ----------
Equals                                 Method       bool Equals(System.Object obj)
GetHashCode                            Method       int GetHashCode()
GetType                                Method       type GetType()
ToString                               Method       string ToString()
AppData                                NoteProperty string AppData=C:\Users\adil\AppData\Roaming
Cache                                  NoteProperty string Cache=C:\Users\adil\AppData\Local\Microsoft\Windows\INetCache
Cookies                                NoteProperty string Cookies=C:\Users\adil\AppData\Local\Microsoft\Windows\INetCookies
Desktop                                NoteProperty string Desktop=C:\Users\adil\Desktop
Favorites                              NoteProperty string Favorites=C:\Users\adil\Favorites

Итак, как вы можете получить доступ к значениям NoteProperty на основе ваших критериев поиска? Вы можете взглянуть на объект и посмотреть, что он может предложить (сокращенно до тех, которые нам интересны):

(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders").psobject


   TypeName: System.Management.Automation.PSMemberSet

Name                MemberType Definition
----                ---------- ----------
Methods             Property
Properties          Property

Если вы посмотрите на элементы или свойства, вы увидите коллекцию, в которой перечислены как имена, так и значения того раздела реестра, который вы просматривали:

PS C:\Users\adil> (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders").psobject.properties |select -first 3


MemberType      : NoteProperty
IsSettable      : True
IsGettable      : True
Value           : C:\Users\adil\AppData\Roaming
TypeNameOfValue : System.String
Name            : AppData
IsInstance      : True

MemberType      : NoteProperty
IsSettable      : True
IsGettable      : True
Value           : C:\Users\adil\AppData\Local\Microsoft\Windows\INetCache
TypeNameOfValue : System.String
Name            : Cache
IsInstance      : True

MemberType      : NoteProperty
IsSettable      : True
IsGettable      : True
Value           : C:\Users\adil\AppData\Local\Microsoft\Windows\INetCookies
TypeNameOfValue : System.String
Name            : Cookies
IsInstance      : True

На основе этой информации вы можете создать новый объект, который будет иметь только те имена и значения данных, которые вы искали, отфильтровав, скажем, оператор -match:

    PS C:\Users\adil> (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders").psobject.Properties| ? {$_.value -match 'appdata'}|select Name,Value

Name          Value
----          -----
AppData       C:\Users\adil\AppData\Roaming
Cache         C:\Users\adil\AppData\Local\Microsoft\Windows\INetCache
Cookies       C:\Users\adil\AppData\Local\Microsoft\Windows\INetCookies
History       C:\Users\adil\AppData\Local\Microsoft\Windows\History
Local AppData C:\Users\adil\AppData\Local
NetHood       C:\Users\adil\AppData\Roaming\Microsoft\Windows\Network Shortcuts
PrintHood     C:\Users\adil\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
Programs      C:\Users\adil\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Recent        C:\Users\adil\AppData\Roaming\Microsoft\Windows\Recent
SendTo        C:\Users\adil\AppData\Roaming\Microsoft\Windows\SendTo
Start Menu    C:\Users\adil\AppData\Roaming\Microsoft\Windows\Start Menu
Startup       C:\Users\adil\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Templates     C:\Users\adil\AppData\Roaming\Microsoft\Windows\Templates
person Adil Hindistan    schedule 26.08.2017
comment
Спасибо за это Адиль! Это было именно то, что я ищу. Отличная функция Get-Member! Очень признателен :) - person RD2017; 28.08.2017