来自列表视图项的复制文件选项弹出复制对话框,因为数组,任何替代方法只做一次复制



抽象的代码:

for($i=0;$i -le $filecount;$i++){
    $name = $droper.Items.Item($i).text
    $copytemp = Split-Path $name.ToString() -leaf -resolve
    $pasteitem = $datepath+"" + $copytemp
    $setclipboard = [System.Windows.Clipboard]::SetFileDropList($name)
    #$t= [System.IO.File]::copy(,$true)
    $t = [Microsoft.VisualBasic.FileIO.FileSystem]::CopyFile($name, $pasteitem, Microsoft.VisualBasic.FileIO.UIOption]::AllDialogs)
} 

这非常有效,除了对于它复制的每个文件的每个循环,都会出现对话框。

有什么方法可以让这个复制对话框只复制数组中的所有文件或循环一次?

如有

疑问,请阅读文档。如果你告诉CopyFile()显示所有对话框([Microsoft.VisualBasic.FileIO.UIOption]::AllDialogs),那么它肯定会按照它所说的去做。如果您不需要对话框,请调用不带该选项的CopyFile()

$t = [Microsoft.VisualBasic.FileIO.FileSystem]::CopyFile($name, $pasteitem)

或者(更好的是),以 PoSh 的方式进行:

for($i=0; $i -le $filecount; $i++) {
  $name = $droper.Items.Item($i).text
  Copy-Item $name "$datepath"
}

如果您希望显示整体进度,可以将Write-Progress添加到组合中:

for($i=0; $i -le $filecount; $i++) {
  $name = $droper.Items.Item($i).text
  Write-Progress -Activity 'Copying ...' -Percent ($i*100/$filecount) -Current $name
  Copy-Item $name "$datepath"
}

如果您需要图形化的整体进度条,则可能需要自己构建它。杰弗里·希克斯(Jeffrey Hicks)在这里发表了一个例子。

Add-Type -Assembly System.Windows.Forms
$form = New-Object Windows.Forms.Form
$form.Text   = 'Copying ...'
$form.Height = 100
$form.Width  = 400
$form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
$progress = New-Object Windows.Forms.ProgressBar
$progress.Name  = 'progressBar1'
$progress.Left  = 5
$progress.Top   = 40
$progress.Value = 0
$progress.Style = 'Continuous'
$drawingSize = New-Object Drawing.Size
$drawingSize.Width  = 360
$drawingSize.Height = 20
$progress.Size = $drawingSize
$form.Controls.Add($progress)
$form.Show()
[void]$form.Focus()
for($i=0; $i -le $filecount; $i++) {
  $name = $droper.Items.Item($i).text
  Copy-Item $name "$datepath"
  $progress.Value = [int]($i*100/$filecount)
  $form.Refresh()
}
$form.Close()

最新更新