Utilisation de Powershell OUT-FILE modifie les données

1

Voici un exemple de code qui affiche des informations sur le disque physique sur la console (avec beaucoup de remerciements à [email protected]):

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]
      }
    }
  }
}

Mais je veux que la sortie de la console aille dans un fichier TXT. Quand j'introduis "Out-File", rien ne se passe sur la console, mais le résultat est différent. Il ne se divise pas (en Go) et affiche des champs différents de ceux que j'ai sélectionnés. Voici ce que j'ai changé:

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]
      }
    }
  }
}

J'ai donc changé la manière dont j'ai implémenté OUT-FILE (en le mettant sur chaque ligne de sortie):

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 
      }
    }
  }
}

Désormais, il divise non seulement la console (en-têtes) et le fichier TXT (valeurs), mais affiche également des variables différentes de celles d’avant et ne fait pas la division, mais affiche uniquement le nombre d’octets, pas les Go.

Est-ce que quelqu'un peut me mettre au courant en utilisant OUT-FILE - ou une meilleure option?

Merci!

JCauble
la source

Réponses:

1

Quelqu'un peut-il me mettre directement sur l'utilisation out-file? Y a-t-il d'autres options?

Vous pouvez simplement utiliser le PowerShell redirection opérateur >> à la fin du script.

    } >> DiskInfo.txt

Si vous voulez utiliser out-file puis mettez-le également à la fin du script.

    } | out-file Diskinfo.txt

Remarques:

  • Changement DiskInfo.txt selon le cas.
  • L'avantage d'utiliser out-file est-ce que les paramètres peuvent être ajoutés à out-file mais non >>

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

Exemple de sortie:

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.     

La source about_Redirection

DavidPostill
la source
Wow, c'était presque trop facile. J'aurais aimé voir ça. Merci beaucoup, je l'apprécie vraiment. Et, j'ai appris, la solution de facilité est la meilleure.
JCauble
Je ne vois nulle part où je peux "accepter la réponse" où que ce soit sur l'écran. Pointez-moi dessus et vous obtenez les points - avec mon appréciation.
JCauble
ahh, j'ai compris. pas évident. mais alors, je suis un débutant sur le forum. Merci.
JCauble
au lieu de >> DiskInfo.txt vous pouvez aussi utiliser | out-file D:\diskinfo.txt s'en tenir à la manière plus "powershelly". Un autre pro pour cela est que vous pouvez ajouter des paramètres à out-file mais vous ne pouvez pas ajouter de paramètres à >>
SimonS
@SimonS Hmm. Je pensais avoir essayé et obtenu une erreur. Je dois avoir fait quelquechose de mal. Merci pour la note, je vais mettre à jour la réponse.
DavidPostill