Запись вывода на консоль в файл - PullRequest
5 голосов
/ 11 марта 2019

Я новичок в написании сценариев и пытаюсь записать информацию, возвращаемую о ВМ, в текстовый файл.Мой скрипт выглядит следующим образом:

Connect-VIServer -Server 192.168.255.255 -Protocol https -User xxxx -Password XXXXXX

Get-VM -Name xxxxxx 

Get-VM xxxxx | Get-HardDisk | Select Parent, Name, Filename, DiskType, Persistence | FT -AutoSize 

Out-File -FilePath C:Filepath

Я могу подключиться к виртуальной машине, получить информацию о жестком диске и увидеть ее в консоли.Файл создается там, где я хочу, и правильно назван.Данные никогда не помещаются в файл.Я пробовал Tee-Object с теми же результатами.Я также попробовал ключ -append.Я видел сообщение о том, что данные возвращаются в виде массива, и Powershell не может переместить данные из массива в строку.Нужно ли создавать переменную для хранения возвращаемых данных и записи в файл оттуда?

Спасибо

Ответы [ 2 ]

5 голосов
/ 11 марта 2019

Ответ Гюнтера Шмитца эффективен, но стоит объяснить, почему:

  • Ваш Out-File -FilePath C:Filepath является автономной командой, которая получает без ввода .

    • Вызов Out-File без ввода просто создает пустой файл (0 байт).
  • Чтобы командлеты, такие как Out-File, получали входные данные от других команд (представленных ниже как ...), необходимо использовать конвейер , что означает, что вы должны поместить | после команды ввода и следовать ей с помощью Out-File вызова:
    Обратите внимание, что я использую более короткий псевдоним параметра -Path для менее часто используемых -FilePath [1]

    ... | Out-File -Path C:Filepath
    
    • В простейшем случае, как указано выше, вся команда (конвейер) помещается в той же строке ; если вы хотите разбить его на несколько строк для удобства чтения, у вас есть два варианта:

      • Поставьте разрыв строки сразу после |, который сообщает PowerShell, что команда продолжается в следующей строке:

        ... |
          Out-File -Path C:Filepath
        
      • Конец строки с явным продолжением строки, что означает размещение ` в самом самом конце строки:

        ... `
        | Out-File -Path C:Filepath
        

В качестве альтернативы, поскольку вы используете Out-File с его поведением по умолчанию, вы можете использовать >, перенаправление вывода вместо:

... > C:Filepath

Пара сторон:

  • Использование Out-File с чем-то отличным от строк и использование Format-* командлетов в целом означает, что вывод подходит только для отображения (потребление человеком), но не для дальнейшего программная обработка .

  • Если вы хотите отправить вывод в и консоль и файл, используйте командлет Tee-Object, как TobyU предлагает:

    ... | Tee-Object -Path C:Filepath
    

[1] Строго говоря, -LiteralPath - лучший выбор в этом случае, потому что -Path интерпретирует свои аргументы как подстановочные выражения. Однако, опуская -Path, то есть указание пути к файлу в качестве позиционного аргумента, как обычно, неявно связывается с -Path.

4 голосов
/ 11 марта 2019

попробуйте это:

Get-VM xxxxx |
 Get-HardDisk |
   Select Parent, Name, Filename, DiskType, Persistence |
     Out-File -FilePath C:\Filepath
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...