【问题标题】:Directory creation failure and no errors目录创建失败并且没有错误
【发布时间】:2022-01-02 03:35:32
【问题描述】:

我做了一个函数,我认为它运行良好。在我的主脚本中,我正在导入该函数,然后调用它。该函数的想法很简单,就是用路径创建一个文件名。 在函数的末尾,我添加了一个检查目录是否存在以及是否创建它的部分。

这里有问题。

  1. 我没有收到任何错误。
  2. 并不总是创建目录`。
  3. 当主脚本运行并尝试导出 csv 时,它不会,因为目录不存在。 3a) 如果我创建目录一切正常。

它尝试创建的文件夹是“C:\Reports”,但我是计算机上的管理员,我知道它应该位于特殊文件夹中。我想如果你们愿意,我可以强制执行。但我认为如果目录无法创建如下所述,我会收到错误。

应该工作的功能部分。

       $ProcessError = $null
        IF (!(test-path $DirectoryName)) {
            New-Item -Path $DirectoryName -ItemType Directory -ErrorAction SilentlyContinue -ErrorVariable ProcessError -Force
            If ($ProcessError) {
                Write-Warning "Problem trying to create $DirectoryName."
            }
            Return [string]$FullPath
        }

这是对该函数的主要调用,奇怪的是我在下面的第 2 节主要中也没有错误!!

第 1 节主要

  If ($SimChange -eq $True) {
        $ResultFileName = MRNAP -ReportName "ExampleGoogleLicenseReport" -Move -JustDate
    }
    Else {
        $ResultFileName = MRNAP -ReportName "GoogleLicenseReport" -Move -JustDate
    }

第 2 节主要

$ProcessError = $null
$Results | Export-Csv $ResultFileName -NoTypeInformation -ErrorVariable ProcessError -ErrorAction SilentlyContinue
If ($ProcessError) {
    Write-Warning "Unable to save report output to $ResultFileName"
}

创建文件名的函数的url。 https://github.com/dcazman/MRNAP/blob/main/MRNAP.ps1

我觉得这一切都非常令人沮丧,并且上面的第 2 节主要。应该给我书面的警告....我想。

【问题讨论】:

  • Return [string]$FullPath... $FullPath 未定义,因此函数返回 $null。此外,如果$DirectoryName 中的路径确实存在,则它不会返回任何内容。
  • @Theo 我没有添加整个函数只是一个部分。这就是为什么我给出了 url,但是如果你认为这个问题更有价值的是我将添加它的整个函数。 $FullPath 在上述行之前创建。
  • 你试过删除-ErrorAction SilentlyContinue吗?看看它抛出的错误没有附加到错误变量中会很有趣:)
  • 是的,并且您所展示的应该工作 - 但也许您不小心遇到了仅在 io/filesystem API 的某些错误类型上出现的错误,谁知道:)
  • 这似乎是 Mathias 指出的错误,应该填充错误变量,但事实并非如此。您应该默认为 try catch,这将 100% 有效。

标签: powershell


【解决方案1】:

在 cmets 中有关于错误和使用 try catch 的讨论。此外,我们之前在堆栈上讨论过这个问题 Create directory if it does not existFunction return value in PowerShell

我现在所做的工作。

 IF (!(test-path $DirectoryName)) {
            $Dircreate = New-Item -ItemType Directory -Force -Path $($DirectoryName.Substring(0, 3)) -Name $($DirectoryName.Substring(3)) -ErrorAction SilentlyContinue -ErrorVariable ProcessError | Out-Null

            If ($ProcessError) {
                Write-Warning "Problem trying to create $DirectoryName."
                [bool]$Created = $False
            }
            Else {
                [bool]$Created = $true
            }
        }

        If ($Created) {
            If ($FullPath -as [string]) {
                Return [string]$FullPath
            }
            Else {
                Return [string]$FullPath[1]
            }
        }

上面没有使用 try catch,但我稍后会试一试。 由于某些错误原因,创建目录将 $fullpath 从字符串更改为数组,这就是为什么上面的测试使用 -as [string]

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多