【问题标题】:Dialog box to save file as on existing script将文件另存为现有脚本的对话框
【发布时间】:2018-04-26 14:54:03
【问题描述】:

我有以下代码,但我试图让它通过动态对话框提示用户,以将输出文件“另存为”。

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

)

【问题讨论】:

  • 一个问题是“你在哪里添加了这些行?”你调查过SaveFileDialog.CreatePrompt = TrueSaveFileDialog.OverwritePrompt = True吗?
  • 抱歉,在关闭对话框之前添加了它。
  • 您是否添加了 winforms 程序集?例如Add-Type -AssemblyName System.Windows.Forms 也调用了$SaveFileDialog.ShowDialog() 来显示窗口?

标签: excel powershell scripting dialog save-as


【解决方案1】:

您需要做一些事情来完成这项工作。首先,添加对 System.Windows.Forms 的引用

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

将此传递给 excel 工作簿的 SaveAs 方法。有关此方法的详细信息,请参阅此答案https://stackoverflow.com/a/25289878/3594883

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

最后关闭您的工作簿并使用 Excel。执行清理等。

【讨论】:

  • 这个答案太彻底了,我希望我能投票赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多