【问题标题】:Powershell ignore "Read Only" request and open without read onlyPowershell忽略“只读”请求并以只读方式打开
【发布时间】:2016-05-11 18:31:16
【问题描述】:

我有一个文档集要求用户打开只读版本(选项“只读推荐”)。我想打开 excel 文档而不只在 powershell 中读取(拒绝提示要求打开“只读”)。这是我当前的代码。

$dir = "\\file_path\*"
$latest = Get-ChildItem -Path $dir | Sort-Object LastAccessTime -Descending | Select-Object -First 1
$latest.name

$excelObj = New-Object -ComObject Excel.Application
$excelObj.Visible = $True
$excelObj.DisplayAlerts = $False


$workBook = $excelObj.Workbooks.Open($latest)

如何忽略只读提示并打开完整版?

【问题讨论】:

    标签: excel powershell


    【解决方案1】:

    应该有一个IgnoreReadOnlyRecommended 参数,您可以在工作簿打开方法中提供该参数:

    $workBook = $excelObj.Workbooks.Open($latest,,,,,,$True,,,,,,,)
    

    Workbooks.Open Method (MSDN)


    编辑

    根据下面的 cmets,当提供 $null 参数时,似乎存在阻止此方法工作的错误。感谢this answer 在另一个问题上似乎有办法解决这个问题:

    1、需要这个功能:

    Function Invoke-NamedParameter {
        [CmdletBinding(DefaultParameterSetName = "Named")]
        param(
            [Parameter(ParameterSetName = "Named", Position = 0, Mandatory = $true)]
            [Parameter(ParameterSetName = "Positional", Position = 0, Mandatory = $true)]
            [ValidateNotNull()]
            [System.Object]$Object
            ,
            [Parameter(ParameterSetName = "Named", Position = 1, Mandatory = $true)]
            [Parameter(ParameterSetName = "Positional", Position = 1, Mandatory = $true)]
            [ValidateNotNullOrEmpty()]
            [String]$Method
            ,
            [Parameter(ParameterSetName = "Named", Position = 2, Mandatory = $true)]
            [ValidateNotNull()]
            [Hashtable]$Parameter
            ,
            [Parameter(ParameterSetName = "Positional")]
            [Object[]]$Argument
        )
    
        end {  ## Just being explicit that this does not support pipelines
            if ($PSCmdlet.ParameterSetName -eq "Named") {
                ## Invoke method with parameter names
                ## Note: It is ok to use a hashtable here because the keys (parameter names) and values (args)
                ## will be output in the same order.  We don't need to worry about the order so long as
                ## all parameters have names
                $Object.GetType().InvokeMember($Method, [System.Reflection.BindingFlags]::InvokeMethod,
                    $null,  ## Binder
                    $Object,  ## Target
                    ([Object[]]($Parameter.Values)),  ## Args
                    $null,  ## Modifiers
                    $null,  ## Culture
                    ([String[]]($Parameter.Keys))  ## NamedParameters
                )
            } else {
                ## Invoke method without parameter names
                $Object.GetType().InvokeMember($Method, [System.Reflection.BindingFlags]::InvokeMethod,
                    $null,  ## Binder
                    $Object,  ## Target
                    $Argument,  ## Args
                    $null,  ## Modifiers
                    $null,  ## Culture
                    $null  ## NamedParameters
                )
            }
        }
    }
    

    这表明Workbooks.Open() 方法可以这样调用:

    $workBook = Invoke-NamedParameter $excelObj "Workbooks.Open" @{"FileName"=$latest;"IgnoreReadOnlyRecommended"=$True}
    

    【讨论】:

    • 第一个命令何时成为有效语法?我上课睡觉了吗? :-) 以前没见过,它在 PowerShell 5.0 中引发错误
    • @FrodeF。我正要编辑那一点——我不是一个合适的 PowerShell 用户,只是 Excel 互操作的粉丝,但我之前看到过以这种方式传递的参数,所以认为它可能有效。经过一些测试,我意识到事实并非如此!
    • -Filename .... 等用于 cmdlet 和函数。 .NET 和 COM 对象中的方法使用标准 c# 语法Open("foo","bar",$null,$null....)。您需要为未使用的可选参数提供$null。但是,当我对此进行测试时,我遇到了最近在 StackOverflow 上提到的 Excel 互操作中的一个错误,其中 Open() 方法在 3-4 个参数后失败.. stackoverflow.com/questions/35452262/…
    • @FrodeF。很高兴知道,有可能偏离主题,有没有办法通过指定参数的名称来乱序调用参数? (例如在 VB 中你会使用argName:=value 语法)
    • 我明白了,现在这很有意义 - 很惊讶现在还没有排序......
    【解决方案2】:

    如果您只想打开文件进行阅读并忽略提示,那么这可行:

    $workBook = $excelObj.Workbooks.Open($latest,$null,$true)
    

    第三个参数表示 true 以只读方式打开。 这种方法似乎不受上述错误的影响!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 2010-12-10
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多