方法调用失败,因为[System.IO.FileInfo]不包含名为'op_Addition'的方法

时间:2016-12-20 18:40:48

标签: powershell

我有以下PowerShell脚本将某些目录中的所有配置文件复制到本地系统。此脚本在我的许多服务器上按预期工作,但在4台服务器上失败:

With Sheets("Southwood").Range("M6:S9")
    .Borders(xlDiagonalDown).LineStyle = xlNone
    .Borders(xlDiagonalUp).LineStyle = xlNone
End With

当它失败时,错误是:

Method invocation failed because [System.IO.FileInfo] does not contain a method named 'op_Addition'.
   at System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception)
   at System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
   at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
   at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)

我验证PowerShell 4.0适用于所有系统,并且所有路径都有效。此脚本在Windows Server 2008 R2和Wdows Server 2012服务器上都成功并失败。

我研究了'op_Addition'错误,但我没有看到它有时候工作而不是其他工作。通常这个错误与尝试操作不是数组的东西有关,但我相信我在我的脚本中已经考虑到了这一点。而且,它确实有效。

我真的不确定问题是什么。非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:1)

刚进入Powershell,我遇到了同样的错误消息。我修复它的方法是调用“.toString()”方法,我正在进行字符串连接。我希望这有助于其他人

   foreach ($file in $configsList) {
        # get the folder the config file lives in so it can be created in the target dir
        $folder = $file.DirectoryName | Split-Path -Leaf

        # $dest = $target + $folder + "\" <-- these are objects, so make them strings as below:

        $dest = $target.ToString() + $folder.ToString() + "\"

        # if the $dest dir does not exist, create it.
        if (-not (Test-Path -Path $dest -PathType Container -ErrorAction SilentlyContinue)) {
            New-Item -ItemType Directory -Force -Path $dest
        }
        # copy the config file to the target directory
        Copy-Item $file -Destination  $dest -Force
    }
    Write-Host " End copying config files ====="

答案 1 :(得分:0)

您需要先初始化数组。在使用它之前添加它: $ configsList = @()

答案 2 :(得分:0)

另一种方法是在分配Get-ChildItem的结果时将变量显式转换为文件对象的数组:

...
    foreach ($dir in $source) {
        [System.IO.FileSystemInfo[]]$configsList += get-childitem -Recurse -Path $dir *.config -Exclude *.dll.config,*.vshost*,*app.config,*packages.config,*-*,*company.config*
    }
...