Casper-SC
@Casper-SC
Программист (.NET)

Не работает скрипт PowerShell. В чём ошибка?

Что не так? Всё сделал, как в примере с одного сайта. Непонимаю.

Да и в ообще скрипт из файла как-то странно запускается. Сначала выводит содержимое файла, а потом уже результат. Работаю из под Visual Studio Code.

[string]$file = Get-Item C:\Windows\explorer.exe
"Размер файла $file составляет $($file.Length) байт"
"Размер: {0:n3} мегабайт" -f ($file.Length / 1mb)


F:\Programming\PowerShell\TextFormat.ps1:8 знак:17
+ "Размер файла $file составляет $($file.Length) Р...
+ ~~~~~~~~
Непредвиденная лексема "айла" в выражении или операторе.

F:\Programming\PowerShell\TextFormat.ps1:9 знак:39
+ "Размер: {0:n3} мегабайт" -f ($file.Length / 1mb)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
В строке отсутствует завершающий символ: ".
  • Вопрос задан
  • 5905 просмотров
Решения вопроса 2
@azarij
В меру опытный никто
уберите [string] с $file

$file = get-item c:\windows\explorer.exe
"file size of $(file.name) is $($file.length) byte"
...
Ответ написан
Casper-SC
@Casper-SC Автор вопроса
Программист (.NET)
Старый текст
В общем, вот как правильно получить размер файла, а не длину строки в символах, которую я получал.
Это я добавил позже, когда я разобрался в чём дело
В Visual Studio Code уже определена переменная $file в конфигурации из-за чего у меня неправильно отображался вывод. Не размер файла в байтах, а длина строки. Подробнее в комментариях к этому сообщению.

Опять старый, но правильный текст
Берём просто класс из .NET System.IO.File и вызываем у него метод ReadAllBytes, далее мы имеем массив байт, у которого есть свойство Length, собственно, это свойство возвращает кол-во элементов в массиве, так как один элемент это значение типа System.Byte, то значит мы получаем кол-во байт. Если знаешь C#, то PowerShell будет в разы проще понять и использовать.

Кстати, оговорюсь. Этот пример явно не самый гениальный вариант, ибо читать в память файл для получения его размера... Как прмер сойдёт.
#Clear-Host

$pathToFile = Get-Item C:\Windows\explorer.exe
$bytes = [System.IO.File]::ReadAllBytes($pathToFile)
"Размер файла $pathToFile составляет $($bytes.Length) байт"
"Размер: {0:n3} мегабайт" -f $($bytes.Length / 1mb)


Вариант 2. Создаём экземпляр класса System.IO.FileInfo и читаем значение свойства Length
$pathToFile = Get-Item C:\Windows\explorer.exe
$fileInfo = [System.IO.FileInfo]::new($pathToFile);
"Размер файла $pathToFile составляет $($fileInfo.Length) байт"
"Размер: {0:n3} мегабайт" -f $($fileInfo.Length / 1mb)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы