listview 项目中的 copyfile 选项由于数组而弹出“复制”对话框,是否有任何替代方法只复制一次?

copyfile option from listview item pops up Copy dialog because of the array, any alternatives to do copy only once?

抽象代码:

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

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

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

如有疑问,请阅读 documentation。如果你告诉 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 发布了一个例子 here.

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()