Путь к файлу с проблемой кавычек в Powershell - PullRequest
0 голосов
/ 25 мая 2018

Я пытался написать скрипт для проверки доступности пути к файлу.Одним из процессов является то, что пользователь должен ввести путь к файлу или просто перетащить файл в командную строку Powershell.

В этом процессе пользователь будет вводить путь к файлу как C: \ Program Files \7-Zip \ 7z.exe и строка станет значением переменной $ filePath , которая будет использоваться в качестве параметра команды Test-Path.

Но иногдапользователь просто перетянет файл в командную строку Powershell, чтобы в строке была пара кавычек, как на рисунке 1. ("C: \ Program Files \ 7-Zip \ 7z.exe") Изображение1

Тогда вы увидите, когда я попытаюсь проверить путь с помощью команды Test-Path с этой переменной $ filePath, в то время как значение (строка) $ filePath включает пару кавычек , результат всегда будет False, даже если путь существует и действителен.Но когда я использую ту же команду Test-Path без использования переменной (я имею в виду просто скопировать и вставить путь к файлу в команду), она работает нормально.

ЭТО странно!

Я попытался ввести путь к файлу с помощью клавиатуры в переменную вместо перетаскивания файла в командную строку Powershell.(Без кавычек) Затем используйте тот же метод для проверки пути к файлу (используя переменную для пути к файлу).Работает нормально.

Картинка 2

Не понимаю.Разве это не одно и то же?

, когда

$filePath = "C:\Program Files\7-Zip\7z.exe"

Ниже 2 команд ДОЛЖНЫ иметь одинаковый результат!ПОЧЕМУ они не?

Test-Path -Path $filePath
Test-Path -Path "C:\Program Files\7-Zip\7z.exe"

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

В случае перетаскивания, похоже, что если путь не имеет пробелов, он вернет true.Если у него есть пробел, то PowerShell помещает кавычки вокруг него.В этом случае PowerShell буквально видит путь как "C:\Program Files\7-Zip\7z.exe"

. То, что вы можете сделать, это использовать оператор -replace следующим образом -

Test-Path -path ($filepath -replace '"', "") -PathType Leaf

ИЛИ

Как подсказывает @Josefz в комментариях, вы также можете использовать Trim() метод, подобный -

Test-Path -path ($filepath.Trim('"')) -PathType Leaf

Не совсем объяснение вашей проблемы, но вы можете использовать это в качестве обходного пути.

0 голосов
/ 25 мая 2018

Если пользователь вводит имя файла, содержащее вложенные символы ", то Test-Path вернет $false.Зачем?Имена файлов не могут содержать символ ";символ " используется синтаксическими анализаторами, чтобы указать, что аргумент в строке содержит пробел.Так что это, конечно, вернет $false:

$filePath = '"C:\Program Files\7-Zip\7z.exe"'
Test-Path $filePath

Встроенные символы " не являются частью имени файла;Вы должны опустить их, чтобы результат был $true.

0 голосов
/ 25 мая 2018

Какую версию powershell вы используете?Я получаю true для обеих команд

PS C:\Users> $filePath = "C:\Program Files\7-Zip\7z.exe"
PS C:\Users> Test-Path -Path $filePath
True
PS C:\Users> Test-Path -Path "C:\Program Files\7-Zip\7z.exe"
True
PS C:\Users> $PSVersionTable.PSVersion
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  48    

РЕДАКТИРОВАТЬ ----------

Понял, проблема в том, что Read-Hostсохранит строку буквально, с кавычками.Простое решение состоит в том, чтобы удалить кавычки

PS C:\Users> $filePath = Read-Host -Prompt "enter input"
enter input: "C:\Program Files\7-Zip\7z.exe"
PS C:\Users> $filePath
"C:\Program Files\7-Zip\7z.exe"
PS C:\Users> Test-Path -Path $filePath
False
PS C:\Users> Test-Path -Path $filePath.replace("`"","")
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...