Використання Powershell OUT-FILE змінює дані


1

Ось приклад коду, який відображає інформацію про фізичний диск на консолі (багато завдяки guyc@computerperformance.co.uk):

Get-WmiObject Win32_DiskDrive | % {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | % {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | % {
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID
        DiskModel   = $disk.Model
        Partition   = $partition.Name
        DriveLetter = $_.DeviceID
        VolumeName  = $_.VolumeName
        Size        = "{0:N}" -f ($_.Size/1GB) -as [float]
            FreeSpace   = "{0:N}" -f ($_.FreeSpace/1GB) -as [float]
      }
    }
  }
}

Але я хочу, щоб консольний вихід перейшов до файлу TXT. Коли я представляю "Out-File", нічого не йде на консоль, але вихід відрізняється. Він не розділяє (на ГБ) і відображає різні поля, ніж те, що я вибрав. Ось що я змінив:

Get-WmiObject Win32_DiskDrive | % {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | % {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | **Out-File -filepath "d:\DiskInfo.txt" -append** | % {
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID
        DiskModel   = $disk.Model
        Partition   = $partition.Name
        DriveLetter = $_.DeviceID
        VolumeName  = $_.VolumeName
        Size        = "{0:N}" -f ($_.Size/1GB) -as [float]
        FreeSpace   = "{0:N}" -f ($_.FreeSpace/1GB) -as [float]
      }
    }
  }
}

Так що я змінив, як я реалізував OUT-FILE (розміщуючи його на кожному рядку виводу):

Get-WmiObject Win32_DiskDrive | % {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | % {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | % {
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID | Out-File -filepath "d:\DiskInfo.txt" -append  
        DiskModel   = $disk.Model | Out-File -filepath "d:\DiskInfo.txt" -append 
        Partition   = $partition.Name | Out-File -filepath "d:\DiskInfo.txt" -append 
        DriveLetter = $_.DeviceID | Out-File -filepath "d:\DiskInfo.txt" -append 
        VolumeName  = $_.VolumeName | Out-File -filepath "d:\DiskInfo.txt" -append 
        Size        = "{0:N}" -f ($_.Size/1GB) -as [float] | Out-File -filepath "d:\DiskInfo.txt" -append 
        FreeSpace   = "{0:N}" -f ($_.FreeSpace/1GB) -as [float] | Out-File -filepath "d:\DiskInfo.txt" -append 
      }
    }
  }
}

Тепер він не тільки розділяє консолі (заголовки) і TXT-файли (значення), але і відображає різні змінні, ніж раніше, і не робить поділ, просто показує кількість байтів, а не ГБ.

Чи може хтось встановити мене прямо з використанням OUT-FILE - або кращого варіанту?

Дякую!

Відповіді:


1

Чи може хто-небудь поставити мене прямо на використання out-file? чи є інші варіанти?

Можна просто використовувати PowerShell перенаправлення оператора >> в кінці сценарію.

    } >> DiskInfo.txt

Якщо ви хочете використовувати out-file потім також в кінці скрипта.

    } | out-file Diskinfo.txt

Примітки:

  • Змінити DiskInfo.txt по мірі необхідності.
  • Перевага використання out-file полягає в тому, що до параметрів можна додати out-file але ні >>

Get-Disk.ps1:

Get-WmiObject Win32_DiskDrive | % {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | % {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | % {
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID
        DiskModel   = $disk.Model
        Partition   = $partition.Name
        DriveLetter = $_.DeviceID
        VolumeName  = $_.VolumeName
        Size        = "{0:N}" -f ($_.Size/1GB) -as [float]
            FreeSpace   = "{0:N}" -f ($_.FreeSpace/1GB) -as [float]
      }
    }
  }
} >> DiskInfo.txt

Приклад виводу:

PS F:\test> .\Get-Disk
PS F:\test> type .\DiskInfo.txt


Size        : 449.46
Partition   : Disk #0, Partition #2
FreeSpace   : 65.36
Disk        : \\.\PHYSICALDRIVE0
DiskModel   : WDC WD5000LPVX-08V0TT5
VolumeName  :
DriveLetter : C:

Size        : 59.61
Partition   : Disk #2, Partition #0
FreeSpace   : 37.13
Disk        : \\.\PHYSICALDRIVE2
DiskModel   : SanDisk Cruzer USB Device
VolumeName  : SANDISK
DriveLetter : E:

Size        : 2794.51
Partition   : Disk #1, Partition #0
FreeSpace   : 1648.17
Disk        : \\.\PHYSICALDRIVE1
DiskModel   : Seagate Expansion Desk USB Device
VolumeName  : Expansion
DriveLetter : F:



PS F:\test>

about_Redirection

The Windows PowerShell redirection operators are as follows.

Operator  Description                Example  
--------  ----------------------     ------------------------------
>         Sends output to the        Get-Process > Process.txt
          specified file.

>>        Appends the output to      dir *.ps1 >> Scripts.txt
          the contents of the  
          specified file.

2>        Sends errors to the        Get-Process none 2> Errors.txt
          specified file.

2>>       Appends errors to          Get-Process none 2>> Save-Errors.txt
          the contents of the 
          specified file.

2>&1      Sends errors (2) and       Get-Process none, Powershell 2>&1
          success output (1) 
          to the success 
          output stream.

3>        Sends warnings to the      Write-Warning "Test!" 3> Warnings.txt
          specified file.

3>>       Appends warnings to        Write-Warning "Test!" 3>> Save-Warnings.txt
          the contents of the 
          specified file.

3>&1      Sends warnings (3) and     function Test-Warning 
          success output (1)         {  Get-Process PowerShell; 
          to the success                Write-Warning "Test!" }
          output stream.             Test-Warning 3>&1

4>        Sends verbose output to    Import-Module * -Verbose 4> Verbose.txt
          the specified file.

4>>       Appends verbose output     Import-Module * -Verbose 4>> Save-Verbose.txt
          to the contents of the 
          specified file.

4>&1      Sends verbose output (4)   Import-Module * -Verbose 4>&1
          and success output (1)    
          to the success output
          stream.              

5>        Sends debug messages to    Write-Debug "Starting" 5> Debug.txt
          the specified file.

5>>       Appends debug messages     Write-Debug "Saving" 5>> Save-Debug.txt
          to the contents of the 
          specified file.

5>&1      Sends debug messages (5)   function Test-Debug 
          and success output (1)     { Get-Process PowerShell 
          to the success output        Write-Debug "PS" }
          stream.                    Test-Debug 5>&1

*>        Sends all output types     function Test-Output
          to the specified file.     { Get-Process PowerShell, none  
                                       Write-Warning "Test!"
*>>       Appends all output types     Write-Verbose "Test Verbose"
          to the contents of the       Write-Debug "Test Debug" } 
          specified file.            
                                     Test-Output *> Test-Output.txt
*>&1      Sends all output types     Test-Output *>> Test-Output.txt
          (*) to the success output  Test-Output *>&1      
          stream.     

Джерело about_Redirection


Wow, це було майже надто легке. Шкода, що я побачив це. Велике спасибі, я дуже ціную це. І, як я дізнався, легкий шлях є найкращим.
JCauble

Я ніде не бачу, що я можу "прийняти відповідь" де-небудь на екрані. Направте мене на це, і ви отримаєте очки - з моєю оцінкою.
JCauble

ahh, отримав це. не очевидно. але потім, я новачок на форумі. Дякую.
JCauble

замість >> DiskInfo.txt можна також використовувати | out-file D:\diskinfo.txt дотримуватися більш "powershelly" шляху. Іншим профі для цього можна додати параметри out-file але додати параметри не можна >>
SimonS

@SimonS Хм. Я думав, що я спробував це і отримав помилку. Напевно, я зробив щось не так. Дякуємо за записку, я оновлю відповідь.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.