Я вызываю powershell из приложения Java (через командную строку Windows) для чтения различных атрибутов файла.
например.
powershell (get-item 'C:\Users\erlpm\Desktop\Temp\s p a c e s.txt').creationTime
Я включаю путь файла в одинарные кавычки, потому что он может содержать пробелы. Он работал нормально, пока не встретил путь к файлу, содержащий квадратные скобки, которые, похоже, интерпретируются как подстановочный знак. Мне удалось решить эту проблему, добавив параметр -literalPath:
powershell (get-item -literalpath 'C:\Users\erlpm\Desktop\Temp\brackets[].txt').creationTime
До сих пор так хорошо... Но пути к файлам могут также содержать одинарные кавычки, знаки доллара, амперсанды,... и все эти символы, похоже, имеют определенную функцию в powershell, для которой параметр -literalPath не работает. Я попытался включить путь с двойными кавычками или экранированием с символом `, но это не решило мою проблему: - (
Любые предложения о том, как передать путь к файлу Powershell, который может содержать пробелы, одинарные кавычки, квадратные скобки, амперсанды, знаки доллара и т.д.?
Update:
Кто-то здесь уже показал мне, как заставить его работать изнутри Powershell, но почему-то ответ был удален?
Во всяком случае, я создал файл с именем $ & ' [].txt
.
Эта форма работает внутри Powershell (необходимо, чтобы избежать &):
PS C:\Users\erlpm> Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"
Directory: C:\Users\erlpm\Desktop\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2012-08-23 14:22 0 $ & ' [].txt
Но когда я выполняю ту же команду Powershell через командную строку Windows,...
C:\Users\erlpm>powershell Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"
... Я получаю эту ошибку:
Ampersand not allowed. The & operator is reserved for future use; use "&" to pass ampersand as a string.
At line:1 char:55
+ Get-Item -LiteralPath C:\Users\erlpm\Desktop\Temp\`$ & <<<< ' [].txt
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : AmpersandNotAllowed
Использование параметра -command
и установка команды powershell между {}
дает точно такое же сообщение об ошибке...
C:\Users\erlpm>powershell -command {Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"}