неправильные результаты powershell для длины файла

#powershell

#powershell

Вопрос:

У меня есть файл длиной 309247 байт в виде этого изображения: введите описание изображения здесь

Если я запущу этот сценарий powershell:

 (Get-Item 'C:TestFile.082').length
309247
  

Но если запустить тот же скрипт, но $file переменную, он возвращает это:

 $fpath = Get-Item $file.FullName
$fpath.length 
309800
# or 
(Get-Item $file.FullName).length
309800
# or
$file.length 
309800
  

ПРИМЕЧАНИЕ $file — это переменная в цикле для всех файлов, содержащихся в каталоге

Почему, если я ссылаюсь на один и тот же файл, результаты отличаются?

Что я могу сделать, чтобы получить реальное значение (309247)?

Это мой полный код

 $filesToFtp = Get-Item  $pathToFtp -Exclude "*.PreARM"  
foreach($file in $filesToFtp)
{
    $fpath = Get-Item $file.FullName
    $fpath.Length

    $FileNode = $oXMLDocumentFiles.CreateElement("element","curtmpremotelxml_files","")
    $nodoXML = "<versionnum>" $versplain "</versionnum>" 
                "<filename>" $file.Name.ToUpper() "</filename>" 
                "<filesize>" $file.length ".00</filesize>" 
    $FileNode.InnerXml = $nodoXML
    $oXMLDocumentFiles.DocumentElement.AppendChild($FileNode)   
}
  

Комментарии:

1. Не удается воспроизвести. Очевидно, вы смотрите на другой файл.

2. Пожалуйста, покажите код, в котором $file задано значение. Я также не могу воспроизвести это и согласен, что вы, вероятно, просматриваете другой файл.

3. Я все еще не могу воспроизвести. Использование .length — это правильный метод получения размера файла. Может быть, ваш путь содержит [ и ] ? Если это так, они обрабатываются как подстановочные знаки.

4. $fpath = Get-Item -LiteralPath $file.FullName

Ответ №1:

Похоже, вы используете не тот командлет, который считаете нужным:

  foreach( $file in (Get-Item 'c:')) { ($file.FullName).Length }
  

это сокращенная версия вашей переменной для заполнения $fPath, но она возвращает объект System.IO.FileSystemInfo, в котором есть элемент с именем FullPath, строка.

Я полагаю, вы этого хотите

 foreach( $file in (Get-ChildItem 'c:')) { ($file.FullName).Length }
  

который вернет массив путей к файлам дочерних элементов (или файлов в папке)

Это также позволит вам очистить несколько вещей

 $currentFilePath = $file.FullName
$fLength = $currentFilePath.Length