【问题标题】:POWERSHELL ISE Bulk/Batch select for encoding conversion (Get-Content & Set-Content)POWERSHELL ISE Bulk/Batch 选择编码转换(Get-Content & Set-Content)
【发布时间】:2016-06-06 03:25:56
【问题描述】:

POWERSHELL ISE

您好,我正在尝试编写一个程序,该程序将抓取输入路径中的所有 .txt 文件、更改编码并将新的 .txt 文件发送到输出位置。

我让它基于单个文本框工作。我不确定如何将它设置在它抓取所有 .txt 文件而不是一个的位置。 (也许是一个数组?)并在新位置以相同的文件名输出。

我的问题是如何编写这个来获取所有 .txt 文件并将它们全部输出到一个新位置,而不是一次只做一个文件?

这是我当前的代码:

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

【问题讨论】:

  • 您实际执行获取、转换和保存文件工作的代码在哪里? IOW,到目前为止,您尝试过什么? Stack Overflow 不是代码编写服务。
  • 为此使用 WIndowsForms 毫无意义(System.Drawing.Point 不会改变这一点)。首先使用 System.IO.Directory.GetFiles 获取您的输入文件路径。然后(在 foreach 中) System.IO.File.ReadAllText 读取文件和 System.IO.File.WriteAllText 写入具有所需编码的文件。不要乱用 WINdows 对话框,而是使用命令行参数和脚本中的 param 部分。
  • 另外值得一提的是Advanced Functions

标签: powershell powershell-5.0


【解决方案1】:

如果您希望用户选择多个文件,您可以使用OpenFileDialog control 允许用户选择多个输入文件,然后将它们添加到ListBox 而不是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)

如果您想允许用户编辑列表,您可以直接从$OpenFileDialog.FileNamesListBox 获取文件名:

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

对于输出目录,使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2014-11-26
    • 2021-04-11
    • 2014-08-23
    相关资源
    最近更新 更多