Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355

Get-Content читает не тот файл

05.04.2018, 17:18. Показов 3916. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра!
Экспериментировал с Get-Content и обнаружил странную штуку. Например, хотим мы получить содержимое файла "C:\1``2.txt" (это не экранирование, это имя файла с двумя грависами подряд). Выберите вариант, который вам кажется правильным:
PowerShell
1
2
3
4
5
6
Get-Content C:\1``2.txt
Get-Content C:\1````2.txt
Get-Content 'C:\1``2.txt'
Get-Content 'C:\1````2.txt'
Get-Content "C:\1``2.txt"
Get-Content "C:\1````2.txt"
Если вы выбрали вариант 4, то правы наполовину. Ежели какой-то другой или несколько вариантов, вы неправы совсем.
Тут такое дело... Если файл "C:\1``2.txt" отсутствует, то только четвертый вариант выдаст:
Не удается найти путь "C:\1``2.txt", так как он не существует.
Остальные же (да-да, все остальные!) вернут это:
Не удается найти путь "C:\1`2.txt", так как он не существует.
Чувствуете разницу? Но это еще не все. Когда мы создадим запрашиваемый файл, четвертый вариант тоже перестанет корректно парсить путь и вместе со всеми будет искать "C:\1`2.txt". Забавно, но создайте "C:\1`2.txt", и все шесть строк будут читать именно его (если "C:\1``2.txt" тоже существует, иначе четвертая ругнется на отсутствие "1`2.txt"). Еще не запутались? Короче, так:
PowerShell
1
2
3
4
5
6
Get-Content C:\1``2.txt     # ищет 1`2.txt
Get-Content C:\1````2.txt   # ищет 1`2.txt
Get-Content 'C:\1``2.txt'   # ищет 1`2.txt
Get-Content 'C:\1````2.txt' # ищет 1`2.txt, если 1``2.txt существует
Get-Content "C:\1``2.txt"   # ищет 1`2.txt
Get-Content "C:\1````2.txt" # ищет 1`2.txt
В общем, чудеса! Получается, что файл с двумя грависами подряд можно прочитать лишь через -LiteralPath. По крайней мере, касательно Get-Content. Потому что не помогают ни передача пути через переменную, ни конкатенация типа:
PowerShell
1
Get-Content ('1``' + [char]96 + '2.txt')
Это достаточно узкое место, если имя читаемого файла может быть произвольным.
Возможно, я упускаю какой-то важный момент, из-за которого подобное поведение командлета можно назвать оправданным. Что думаете?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2018, 17:18
Ответы с готовыми решениями:

File.get() читает не тот что нужно символ
#include <iostream> #include <fstream> #include <limits> #include <string> #include <conio.h> #include <Windows.h> using...

Программа, которая читает текстовый файл в типизированный файл
Нужно написать программу, которая читает текстовый файл в типизированный файл и печатает его содержание на экране Только вот не очень...

Content-Language и Content-Type для оптимизации
Есть сайт на котором норм кол-во страниц но яндекс почему-то проиндексировал лишь 5 из них на всех страницах есть тег Content-Language, но...

9
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
05.04.2018, 17:35
Цитата Сообщение от mytilus Посмотреть сообщение
Получается, что файл с двумя грависами подряд можно прочитать лишь через -LiteralPath
И то только, если такой путь заключить в одинарные кавычки.

-LiteralPath <String[]>
Определяет путь к элементу. В отличие от параметра Path, значение параметра LiteralPath используется строго в том виде, в котором оно указано. Никакие символы не интерпретируются как знаки подстановки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Windows PowerShell не интерпретирует текст, заключенный в такие кавычки, как escape-символы.
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
05.04.2018, 17:44  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
И то только, если такой путь заключить в одинарные кавычки.
Да, именно так. Сейчас нашел, что Test-Path ведет себя точно так же с подобными именами файлов. Он тоже выдает правильный результат только с -LiteralPath и одинарными кавычками. Что-то тут не то...
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
05.04.2018, 17:50
Цитата Сообщение от mytilus Посмотреть сообщение
Что-то тут не то...
А почему не то? В справке про это написано. -Path обрабатывает путь пытаясь интерпретировать знаки подстановки, поэтому специально добавлен -LiteralPath, про который тоже есть оговорка "если путь содержит escape-символы, заключите его в одинарные кавычки"
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
05.04.2018, 17:53  [ТС]
"Не то" здесь в том, что Get-Content 'C:\1````2.txt' и Get-Content "C:\1````2.txt" должны хотеть прочесть не "1`2.txt", а "1``2.txt" вне зависимости от того, существует этот файл или отсутствует. Разве нет?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
05.04.2018, 18:14
Цитата Сообщение от mytilus Посмотреть сообщение
Get-Content 'C:\1````2.txt' и Get-Content "C:\1````2.txt" должны хотеть прочесть не "1`2.txt", а "1``2.txt"
PowerShell
1
2
'C:\1````2.txt'
"C:\1````2.txt"
Code
1
2
C:\1````2.txt
C:\1``2.txt
+

PowerShell
1
2
3
"1``2.txt"
"1````2.txt"
'1``2.txt'
Code
1
2
3
1`2.txt
1``2.txt
1``2.txt
Однако, судя по сообщению об ошибке "Не удается найти путь "C:\temp\1`2.txt", так как он не существует." при выполнение gc "1````2.txt", ключ -path парсит путь "1````2.txt" иначе, чем powershell простые строки и поэтому, если не предполагается использование подстановочных знаков, лучше использовать ключ -LiteralPath
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
05.04.2018, 18:30  [ТС]
Конечно, хотелось бы понять идею такого причудливого парсинга пути, поскольку (как я уже писал) некоторые другие командлеты придерживаются той же стратегии. Хорошо бы выявить их всех и держать в уме их своеобразный взгляд на грависы в аргументе.
Как по мне, это очень не похоже на баг, поскольку четвертый вариант, приведенный в моем стартовом посте, парсит путь корректно, если файла не существует.
Можно, кстати, добавить, что Get-Content сворачивает любое количество грависов подряд до одного. Вариант
PowerShell
1
gc "1``````````2.txt"
тоже будет обращаться "1`2.txt". Очень похоже на результат зацикленного парсинга.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
05.04.2018, 18:56
Цитата Сообщение от mytilus Посмотреть сообщение
Можно, кстати, добавить, что Get-Content сворачивает любое количество грависов подряд до одного
Именно так и происходит.

Могу предположить, что т.к. символ ` (backtick) ещё и переносит команду на новую строку, а также экранирует $ ' " в строках, а также вставляет в строки переносы, табуляции и т.п. `n `t `r, при этом -path пытается разобрать путь в поисках подстановочных символов - всё это вместе и приводит к такому эффекту...

Добавлено через 12 минут
Цитата Сообщение от mytilus Посмотреть сообщение
Сейчас нашел, что Test-Path ведет себя точно так же с подобными именами файлов.
И ещё несколько десятков командлетов

Причём, какой-нибудь '111' | Add-Content '1``2.txt' не показав ошибки, просто добавит текст в "1`2.txt"

PowerShell
1
(Get-Command -ParameterName LiteralPath).Name | sort
Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Add-Content
Add-Type
Clear-Content
Clear-Item
Clear-ItemProperty
Convert-Path
Copy-Item
Copy-ItemProperty
Export-Alias
Export-Clixml
Export-Csv
Export-FormatData
Format-Hex
Get-Acl
Get-AuthenticodeSignature
Get-ChildItem
Get-CmsMessage
Get-Content
Get-FileHash
Get-Item
Get-ItemProperty
Get-ItemPropertyValue
Get-PfxCertificate
Import-Alias
Import-Clixml
Import-Csv
Import-PowerShellDataFile
Invoke-Item
Move-Item
Move-ItemProperty
New-ItemProperty
Out-File
Protect-CmsMessage
Push-Location
Remove-Item
Remove-ItemProperty
Rename-Item
Rename-ItemProperty
Resolve-Path
Save-Help
Select-String
Select-Xml
Set-Acl
Set-AuthenticodeSignature
Set-Clipboard
Set-Content
Set-Item
Set-ItemProperty
Set-Location
Split-Path
Start-Job
Tee-Object
Test-Path
Unblock-File
Unprotect-CmsMessage
Update-Help


Добавлено через 7 минут
Ещё занятней:

PowerShell
1
2
Split-Path -Path "c:\temp\1''2.txt" -Leaf
Split-Path -Path 'c:\temp\1''2.txt' -Leaf
Code
1
2
1''2.txt
1'2.txt
А ключ -LiteralPath не совместим с ключом -Leaf
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
05.04.2018, 20:28  [ТС]
Со Split-Path все правильно вышло. Два апострофа в одинарных кавычках - это escape, означающий один апостроф.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
05.04.2018, 21:23
Цитата Сообщение от mytilus Посмотреть сообщение
Со Split-Path все правильно вышло. Два апострофа в одинарных кавычках - это escape, означающий один апостроф.
Это я перепутал и некорректно привёл пример с одинарными кавычками ' в пути вместо ` (backtick)

А так да, ключ -Path в Split-Path, обрабатывает имена ожидаемо, в отличие от gc, ac, sc, gi, Test-Path ...

PowerShell
1
2
3
Split-Path -Path "c:\temp\1``2.txt" -Leaf
Split-Path -Path "c:\temp\1````2.txt" -Leaf
Split-Path -Path 'c:\temp\1``2.txt' -Leaf
Code
1
2
3
1`2.txt
1``2.txt
1``2.txt
Добавлено через 22 минуты
Ещё не очевидные места, где всплывает эта проблема

PowerShell
1
2
3
4
5
6
7
$path = 'C:\temp\_Files\1``2.txt'
ni $path
ls (Split-Path $path) -File                     # 1``2.txt 
ls (Split-Path $path) -File | gi                # 1``2.txt 
ls (Split-Path $path) -File | %{$_ | gi}        # 1``2.txt 
ls (Split-Path $path) -File | %{gi $_}          # Не удается найти путь "C:\Temp\1`2.txt", так как он не существует.
ls (Split-Path $path) -File | %{gi $_.FullName} # Не удается найти путь "C:\Temp\1`2.txt", так как он не существует.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Каталог: C:\temp\_Files\
 
Mode                LastWriteTime         Length Name  
----                -------------         ------ ----             
-a----       05.04.2018     21:18              0 1``2.txt 
-a----       05.04.2018     21:18              0 1``2.txt                                                                                                                                                   
-a----       05.04.2018     21:18              0 1``2.txt
-a----       05.04.2018     21:18              0 1``2.txt                                                                                                                                                   
gi : Не удается найти путь "C:\Temp\1`2.txt", так как он не существует.
строка:7 знак:33
+ ls (Split-Path $path) -File | %{gi $_}          # Не удается найти пу ...
 
gi : Не удается найти путь "C:\temp\_Files\1`2.txt", так как он не существует.
строка:8 знак:33
+ ls (Split-Path $path) -File | %{gi $_.FullName} # Не удается найти пу ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2018, 21:23
Помогаю со студенческими работами здесь

Content-Type и Excel файл
Немного не тему, но все же: написал сервлетик, которые выплевывает некий отчетик в виде Excel'евской таблицы...

Include 'content.php' вместо $content$
Здравствуйте уважаемые форумчане! Нужна ваша помощь. И так, например, в файле index.php имеется строковая переменная: $var = 'Здесь...

Несмотря того что я поставил <META content='text/html; charset=UTF-8' http-equiv=Content-Type>, в броузере она всеровно меняется.
Несмотря того что я поставил &lt;META content='text/html; charset=UTF-8' http-equiv=Content-Type&gt;, в броузере она всеровно меняется.

не читает файл
Проблема такова: пытаюсь открыть текстовый файл,код точно правильный,т.к работает на другом компьютере,но у меня выдает пустой экран.в...

Не читает файл
Почему не читаются данные из файла? Помогите исправить Задача: Авиабилет Структура записи -пункт назначения - номер рейса -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru