代码之家  ›  专栏  ›  技术社区  ›  Fiery Madness

将文件另存为现有脚本的对话框

  •  1
  • Fiery Madness  · 技术社区  · 7 年前

    我有以下代码,但我正试图让它用一个动态对话框提示用户将输出文件保存为。

    $pathtsv = "c:\test.txt"
    $pathxlsx = "c:\NBP ESP-152 REV F TEMPLATE.xlsx"
    
    $Excel = New-Object -ComObject "Excel.Application"
    $Excel.Visible=$true 
    
    $Workbook = $Excel.Workbooks.Open($pathxlsx) # Open Template
    $TempWorkbook = $Excel.Workbooks.Opentext($pathtsv) # Open text file in excel
    
    $temp = $excel.Workbooks.Item(2)  #select workbook with text
    $temp = $temp.Worksheets.Item(1) #select text worksheet
    $CopyRange = $temp.Range("A1:G8") #set range
    $CopyRange.Copy()  #copy data
    
    $workbooksheet = $Workbook.Worksheets.Item(1)#sets doc to copy to
    $Workbooksheet.activate()
    $PasteRange = $workbooksheet.Range("A3:J10") #sets range
    $workbooksheet.Paste($PasteRange)#paste data
    
    #save and close the workbook
    $Workbook.Close($true)
    $Excel.Quit()
    while( [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)){}
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()
    

    所以我试着加入:

    $SaveFileDialog = New-Object windows.forms.savefiledialog   
        $SaveFileDialog.initialDirectory = [System.IO.Directory]::GetCurrentDirectory() 
    

    但它似乎不起作用。不知道为什么,可能是因为我对powershell脚本还不太熟悉。我只想在“另存为”对话框中结束它,这样就可以了。我必须剪掉原稿的结尾吗?(也就是说,这个被剪掉了吗?

    $Workbook.Close($true)
    $Excel.Quit()
    while( [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)){}
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()
    

    )

    1 回复  |  直到 7 年前
        1
  •  2
  •   StephenP    7 年前

    你需要做一些事情才能让这一切顺利进行。首先,添加对系统的引用。窗户。形式

    Add-Type -AssemblyName System.Windows.Forms
    

    复制/粘贴操作后,创建对话框并设置几个属性

    $SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
    $SaveFileDialog.initialDirectory = [System.IO.Directory]::GetCurrentDirectory()
    $SaveFileDialog.Filter = 'All files (*.*)|*.*'
    

    这是您需要决定在显示对话框时要做什么的地方。你是否允许用户取消,你如何处理空路径,不正确的扩展等。。。为了举例,我将继续展示它,直到选择了一条路径。我并不认为这是一个好的选择。

    $dialogResult = $null
    while($dialogResult -ne "OK"){
        $dialogResult = $SaveFileDialog.ShowDialog()
    }
    

    然后,您可以使用FileName属性访问所选路径,并对其执行所需的检查

    $SaveFileDialog.FileName
    

    https://stackoverflow.com/a/25289878/3594883

    $WorkBook.SaveAs($SaveFileDialog.FileName, 51, [Type]::Missing, [Type]::Missing, $false, $false, 1, 2)
    

    最后关闭工作簿和excel。执行清理等。