2016-04-28 10 views
1

So kann ich Out-File verwenden, um eine vollständige Verzeichnisliste in eine Textdatei zu schreiben, aber mein Problem ist, dass ich nur schreiben möchte bestimmte Teile des Verzeichnisses zu der Datei, dh ich möchte nur den Verzeichnisnamen, den Dateinamen, die Länge der Datei und die letzte Schreibzeit schreiben.PowerShell: Out-File verwenden, um einen bestimmten Teil der Dir-Auflistung in eine Textdatei zu schreiben

Hier ist, was ich versucht habe:

ich die „~“ als Trennzeichen verwenden.

cls 

$Path = "C:\Testpath" 
$OutFile = "C:\Testpath\Output.txt" 

gci -Path $Path -Recurse | % { $_.Directory + "~" + $_.Name + "~" + $_.Length + "~" + $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss") } | Out-File $Outfile 

Es scheint, die Datei und schreibt ein paar Zeilen zu erstellen, dann bekomme ich diese Fehlermeldung mehrmals, bis das Skript beendet. Die wenigen Zeilen, die geschrieben wurden, scheinen die Unterordner im übergeordneten Ordner zu sein.

Fehler:

+ : Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'. 

At C:\SomeDirectory.ps1:4 char:46 
+ gci -Path $Path -Recurse | % { $_.Directory + <<<< "~" + $_.Name + "~" + $_.Length + "~" + $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss") } | Out-File $Outfile 
+ CategoryInfo   : InvalidOperation: (op_Addition:String) [], RuntimeException 
+ FullyQualifiedErrorId : MethodNotFound 

Hinweis: ersetzt ich meine tatsächliche Lage mit C: \ somedirectory in den Fehler aus offensichtlichen Gründen.

Antwort

1

Run

$Path = "C:\Testpath" 
gci -Path $Path | Get-Member -MemberType Properties | ft -AutoSize 

Sie können sehen, dass es verschiedene Sätze von Eigenschaften für

  • Type-Name: System.IO.DirectoryInfo:
    • nein .Directory Eigenschaft: .PSParentPath.Remove(0,38) oder .PSParentPath.Replace('Microsoft.PowerShell.Core\FileSystem::', '') stattdessen verwenden (nicht intelligentere Substitution gefunden);
    • nein .Length eigentum: verwenden "-0" oder was auch immer sonst;
  • Type-Name: System.IO.FileInfo:
    • Verwendung .DirectoryName Eigenschaft (Typ string) statt .Directory ein (Typ System.IO.DirectoryInfo).

Hier ist meine Dummy Lösung:

$Path = "C:\Testpath" 
$OutFile = "C:\Testpath\Output.txt" 

gci -Path $Path -Recurse | % { 
    if ($_.Attributes -match "Directory") { 
     $_.PSParentPath.Remove(0,38) + "~" + $_.Name + "~" + "-0" + "~" + $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss") 
    } else { 
     $_.DirectoryName + "~" + $_.Name + "~" + $_.Length + "~" + $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss") 
    } 
} | Out-File $Outfile 
2

Try Directory String zu konvertieren:

$_.Directory.ToString() 
+0

, die ein wenig (er schrieb ein paar Zeilen in die Datei zu arbeiten schien, aber hart im Augenblick zu sagen, ob es alles geschrieben), aber ich habe einen neuen Fehler bekommen: 'ToString: Sie können keine Methode für einen nullwertigen Ausdruck aufrufen. ' – danglesauce19

+0

@ chrisdoubleu13 Bevor Sie eine Variable ** verwenden, müssen Sie eine ** Nullprüfung durchführen. Nur eine gute Praxis Kumpel. Auch das ist eine separate Frage. Majkinetor hat die Frage, die Sie ursprünglich gestellt haben, gelöst. Ich glaube, wenn Ihr ursprüngliches Problem gelöst ist, können Sie das als Antwort sehr gut akzeptieren. Ich erhebe diese Antwort. Lassen Sie uns wissen, ob Sie immer noch den gleichen Fehler haben. Sie können immer eine andere Frage öffnen, wenn Sie während der Arbeit mit anderen Fehlern konfrontiert werden und nachdem Sie versucht haben, nach Antworten zu suchen. –

Verwandte Themen