2016-06-05 20 views
0

Powershell ISEPowershell ISE Masse/Charge wählt für die Umwandlung kodiert (Get-Content & Set-Content)

Hallo, ich versuche, ein Programm zu schreiben, das alle TXT-Dateien in einem Eingangspfad greifen wird, ändern die Codierung und senden Sie die neuen TXT-Dateien an einen Ausgabeort.

Ich habe es funktioniert basierend auf einzelnen Textfelder. Ich bin mir nicht ganz sicher, wie ich es einstellen soll, wo es alle .txt-Dateien statt einer Datei ablegt. (vielleicht ein Array?) Und mit dem gleichen Dateinamen an einem neuen Ort ausgeben.

Meine Frage ist, wie kann ich dies schreiben, um alle TXT-Dateien zu greifen und sie alle an einem neuen Ort auszugeben, anstatt eine einzelne Datei zu einer Zeit zu machen?

Hier ist mein aktueller Code:

Add-Type -AssemblyName System.Windows.Forms 
Add-Type -AssemblyName System.Drawing 


$form = New-Object System.Windows.Forms.Form 
$form.Text = "Text Converter" 
$form.Size = New-Object System.Drawing.Size(300,300) 
$form.StartPosition = "CenterScreen" 

$OKButton = New-Object System.Windows.Forms.Button 
$OKButton.Location = New-Object System.Drawing.Point(55,230) 
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
$OKButton.Text = "OK" 
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK 
$form.AcceptButton = $OKButton 
$form.Controls.Add($OKButton) 

$CancelButton = New-Object System.Windows.Forms.Button 
$CancelButton.Location = New-Object System.Drawing.Point(150,230) 
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
$CancelButton.Text = "Cancel" 
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel 
$form.CancelButton = $CancelButton 
$form.Controls.Add($CancelButton) 


$label = New-Object System.Windows.Forms.Label 
$label.Location = New-Object System.Drawing.Point(10,20) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Input Path:" 
$form.Controls.Add($label) 



$textBox = New-Object System.Windows.Forms.TextBox 
$textBox.Location = New-Object System.Drawing.Point(10,40) 
$textBox.Size = New-Object System.Drawing.Size(260,20) 
$form.Controls.Add($textBox) 


$label = New-Object System.Windows.Forms.Label 
$label.Location = New-Object System.Drawing.Point(10,65) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Input Encoding:" 
$form.Controls.Add($label) 



$textBox2 = New-Object System.Windows.Forms.TextBox 
$textBox2.Location = New-Object System.Drawing.Point(10,85) 
$textBox2.Size = New-Object System.Drawing.Size(260,20) 
$form.Controls.Add($textBox2) 


$label = New-Object System.Windows.Forms.Label 
$label.Location = New-Object System.Drawing.Point(10,115) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Output Path:" 
$form.Controls.Add($label) 



$textBox3 = New-Object System.Windows.Forms.TextBox 
$textBox3.Location = New-Object System.Drawing.Point(10,140) 
$textBox3.Size = New-Object System.Drawing.Size(260,20) 
$form.Controls.Add($textBox3) 

$label = New-Object System.Windows.Forms.Label 
$label.Location = New-Object System.Drawing.Point(10,170) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Output Encoding" 
$form.Controls.Add($label) 

$textBox4 = New-Object System.Windows.Forms.TextBox 
$textBox4.Location = New-Object System.Drawing.Point(10,190) 
$textBox4.Size = New-Object System.Drawing.Size(260,20) 
$form.Controls.Add($textBox4) 




$form.Topmost = $True 

$form.Add_Shown({$textBox.Select()}) 
$result = $form.ShowDialog() 

if ($result -eq [System.Windows.Forms.DialogResult]::OK) 
{ 
    $x = $textBox.Text 
    $x 

    $x2 = $textBox2.Text 
    $x2 

    $x3 = $textBox3.Text 
    $x3 

    $x4 = $textBox4.Text 
    $x4 
} 


Get-Content $x -encoding $x2 | 
Set-Content $x3 -encoding $x4 
+0

Wo ist der Code, an dem Sie die Dateien holen, konvertieren und speichern? Iow, was hast du bisher probiert? Stack Overflow ist kein Code-Schreibdienst. – alroc

+0

Die Verwendung von WindowsForms ist sinnlos (System.Drawing.Point ändert das nicht). Verwenden Sie zuerst System.IO.Directory.GetFiles, um Ihre Eingabedateipfade abzurufen. Dann (in einem foreach) System.IO.File.ReadAllText, um eine Datei und System.IO.File.WriteAllText zu lesen, um eine Datei mit der gewünschten Codierung zu schreiben. Verwechseln Sie nicht die Windows-Dialogfelder, verwenden Sie stattdessen Befehlszeilenargumente und einen Param-Abschnitt in Ihrem Skript. –

+0

Auch erwähnenswert in [Erweiterte Funktionen] (https: // technet.microsoft.com/en-us/magazine/hh413265.aspx) – user4317867

Antwort

1

Wenn Sie die Benutzer wollen mehrere Dateien auswählen, können Sie ein OpenFileDialog control verwenden, um die Benutzer zu ermöglichen, mehrere Eingabedateien auszuwählen und sie dann in ein ListBox hinzufügen eher als ein TextBox:

# Use a ListBox, since we're going to keep track of multiple strings 
$InputFileBox = New-Object System.Windows.Forms.ListBox 
$InputFileBox.Location = New-Object System.Drawing.Point -ArgumentList 10,10 
$InputFileBox.Size = New-Object System.Drawing.Size -ArgumentList 265,240 
$Form.Controls.Add($InputFileBox) 

# Set up the "OpenFile" dialog, set the Multiselect property 
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog 
$OpenFileDialog.InitialDirectory = 'D:\test\forms' 
$OpenFileDialog.Multiselect = $true 

$OpenFileButton = New-Object System.Windows.Forms.Button 
$OpenFileButton.Location = New-Object System.Drawing.Point -ArgumentList 220,265 
$OpenFileButton.Size = New-Object System.Drawing.Size -ArgumentList 55,20 
$OpenFileButton.Text = 'Browse!' 
$OpenFileButton.add_Click({ 
    if($OpenFileDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) 
    { 
     foreach($FileName in $OpenFileDialog.FileNames) 
     { 
      # only add files not already in the list 
      if(-not $InputFileBox.Items.Contains($FileName)) 
      { 
       $InputFileBox.Items.Add($FileName) 
      } 
     } 
    } 
}) 
$Form.Controls.Add($OpenFileButton) 

Select multiple files!

Sie können dann gra b die Dateien Namen entweder direkt aus dem $OpenFileDialog.FileNames oder vom ListBox, wenn Sie wollen, dass der Benutzer die Liste bearbeiten:

$FileNames = [string[]]$InputFileBox.Items 

Für das Ausgabeverzeichnis, verwenden Sie einen FolderBrowserDialog control:

# TextBox is fine here, but disable it so users can't type directly in it 
$OutputFolderTextBox = New-Object System.Windows.Forms.TextBox 
$OutputFolderTextBox.Location = New-Object System.Drawing.Point -ArgumentList 10,10 
$OutputFolderTextBox.Size = New-Object System.Drawing.Size -ArgumentList 265,20 
$OutputFolderTextBox.Enabled = $false 
$OutputFolderTextBox.BackColor = [System.Drawing.Color]::White 
$Form.Controls.Add($OutputFolderTextBox) 

# set up FolderBrowserDialog control 
$OutputFolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog 
$OutputFolderBrowserDialog.RootFolder = [System.Environment+SpecialFolder]::MyComputer 

$OutputFolderBrowseButton = New-Object System.Windows.Forms.Button 
$OutputFolderBrowseButton.Location = New-Object System.Drawing.Point -ArgumentList 220,40 
$OutputFolderBrowseButton.Size = New-Object System.Drawing.Size -ArgumentList 55,20 
$OutputFolderBrowseButton.Text = 'Browse!' 
$OutputFolderBrowseButton.add_Click({ 
    if($OutputFolderBrowserDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) 
    { 
     # grab the selected folder path 
     $OutputFolderTextBox.Text = $OutputFolderBrowserDialog.SelectedPath 
    } 
}) 
$Form.Controls.Add($OutputFolderBrowseButton) 

Select output folder