Мне вчера на почту пришёл комментарий на пост: Смена владельца папки или файла в PowerShell (часть 2), в котором сообщалось об ошибке, которую генерирует скрипт, если в пути есть служебные мета-символы, как апостроф (одиночкая кавычка). А дело было в том, что этот мета-символ нужно дополнительно эскейпить (помимо обратных слешей в пути). То же касается и квадратных скобок. Одиночные кавычки эскейпятся очень просто – одним обратным слешем:
[↓] [vPodans] $path = "C:\Users\vPodans\text'text.txt" [↓] [vPodans] $path = $path -replace "\\|'", '\$0' [↓] [vPodans] $path C:\\Users\\vPodans\\text\'text.txt [↓] [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter "path='$path'" __GENUS : 2 __CLASS : Win32_LogicalFileSecuritySetting __SUPERCLASS : Win32_SecuritySetting __DYNASTY : CIM_Setting __RELPATH : Win32_LogicalFileSecuritySetting.Path="C:\\Users\\vPodans\\text'text.txt" <...>
Но с квадратными скобками такой фокус не прошёл:
[↓] [vPodans] $path = "C:\Users\vPodans\text[text.txt" [↓] [vPodans] $path = $path -replace "\\|\[", '\$0' [↓] [vPodans] $path C:\\Users\\vPodans\\text\[text.txt [↓] [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter "path='$path'" Get-WmiObject : Invalid query At line:1 char:5 + gwmi <<<< Win32_LogicalFileSecuritySetting -filter "path='$path'" + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand [↓] [vPodans]
попытка заэскейпить квадратные скобки при помощи бэктика (`) успехом не увенчалась:
[↓] [vPodans] $path = "C:\Users\vPodans\text[text.txt" [↓] [vPodans] $path = $path -replace "\\", '\$0' [↓] [vPodans] $path = $path -replace "\[", '`$0' [↓] [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter "path='$path'" [↓] [vPodans]
он вообще файл не нашёл так. На удачу решил опробовать хитрый вариант – не эскейпить символ, а вписать его char номер из таблицы ASCII. И вот что у меня вышло:
[↓] [vPodans] $path = "C:\Users\vPodans\text[text.txt" [↓] [vPodans] $path = $path -replace "\\", '\$0' [↓] [vPodans] [int][char]"[" 91 [↓] [vPodans] $path = $path -replace "\[", "$([char]91)" [↓] [vPodans] $path C:\\Users\\vPodans\\text[text.txt [↓] [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter "path='$path'" __GENUS : 2 __CLASS : Win32_LogicalFileSecuritySetting __SUPERCLASS : Win32_SecuritySetting __DYNASTY : CIM_Setting __RELPATH : Win32_LogicalFileSecuritySetting.Path="C:\\Users\\vPodans\\text[text.txt" <...>
И этот финт сработал! Тот же самый манёвр делается и для второй квадратной скобки:
[↓] [vPodans] $path = "C:\Users\vPodans\text[text].txt" [↓] [vPodans] $path = $path -replace "\\", '\$0' [↓] [vPodans] $path = $path -replace "\[", "$([char]91)" [↓] [vPodans] [int][char]"]" 93 [↓] [vPodans] $path = $path -replace "\]", "$([char]93)" [↓] [vPodans] $path C:\\Users\\vPodans\\text[text].txt [↓] [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter "path='$path'" __GENUS : 2 __CLASS : Win32_LogicalFileSecuritySetting __SUPERCLASS : Win32_SecuritySetting __DYNASTY : CIM_Setting __RELPATH : Win32_LogicalFileSecuritySetting.Path="C:\\Users\\vPodans\\text[text].txt" <...>
Но в именах файлов и папок может содержаться один коварный символ – backtick (`). Его заэскейпить не представляется возможным, поэтому единственный выход с ним – прописывать путь в одинарных кавычках, чтобы этот мета-символ использовался в качестве литерала. В связи с чем я немного подрихтовал пост, ссылка на который приведена в начале этого поста.
Remember Me