Powershell:您不能调用空值表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell:您不能调用空值表达式相关的知识,希望对你有一定的参考价值。

Hello Stack Overflow社区,

目前我正在努力使用这段代码(它并不那么漂亮):

$filepath = "C:inetpublogsLogFiles"
$filearchivepath = "C:inetpublogs"
$daystoarchive = 1
$_ = "";

function create-7zip([String] $aDirectory, [String] $aZipfile){
    #change the path where you downloaded the 7z exe
    [string]$pathToZipExe = "C:UserskschweigerDownloads7za.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory";
    & $pathToZipExe $arguments;
}


#Create a new folder with the specific date
$ArchiveFolder = (Get-Date -Format dd.MM.yyyy) + " - Logs-Archive"
if(Test-Path "$filearchivepath$ArchiveFolder"){
    Write-Host "Folder already exists!"
}else{
    New-Item -Path $filearchivepath -Name $ArchiveFolder -ItemType directory
}


#Save alle files older than X days into $Files
$Files = Get-ChildItem -Path $filepath -Recurse | where {$_.LastWriteTime -lt (Get-Date).AddDays(-$daystoarchive)}

#Copy/Move files and keep folder structure
foreach ($File in $Files){

    $NewPath = $File.DirectoryName.Replace($filepath,"")

    if (!(Test-Path "$filearchivepath$ArchiveFolder$NewPath"))
    {
        New-Item -Path "$filearchivepath$ArchiveFolder$NewPath" -ItemType Directory
    }

    $File | Copy-Item -Destination "$filearchivepath$ArchiveFolder$NewPath"
}

#Compress folder
if(Test-Path "$filearchivepath$ArchiveFolder.zip"){
    Write-Host "Archive-File already exists!"
}else{
    #[IO.Compression.ZipFile]::CreateFromDirectory("$filearchivepath$ArchiveFolder","$filearchivepath$ArchiveFolder.zip")
    create-7zip "$filearchivepath$ArchiveFolder"  "$filearchivepath$ArchiveFolder.zip"
    #Delete Folder
    Remove-Item -Path "$filearchivepath$ArchiveFolder" -Recurse -Force
}

代码有效。但我也收到一条错误消息:

您不能调用空值表达式

我该如何解决这个问题?

答案

Get-ChildItem默认返回文件和文件夹。如果您只需要文件,则应使用-File。否则,您的$Files也将包含文件夹(因为它们具有LastWriteTime属性)。

如果您尝试在文件夹上运行.DirectoryName.Replace($filepath,""),它将返回此类错误,因为您无法在$null上运行替换。

更新:对于PowerShell 2.0,您可以使用| where { ! $_.PSIsContainer }source


How can I troubleshoot it by myself?

在您的错误中,您可以看到哪条线被破坏:

$NewPath = $File.DirectoryName.Replace($filepath,"")

要解决此类问题,您只需列出所有涉及的变量并检查其值即可。你可以这样做:

$File
$File.DirectoryName
Pause

$NewPath = $File.DirectoryName.Replace($filepath,"")

使用Pause非常有用,因为在继续之前它会等待你按Enter键。

以上是关于Powershell:您不能调用空值表达式的主要内容,如果未能解决你的问题,请参考以下文章

是否有用于 React Function 组件的类型,包括返回片段、空值、字符串等?

Powershell Return-Job 有时会返回空值

powershell PowerShell:数据库空值

调用 TF.exe 的 powershell 脚本中的表达式或语句中出现意外的令牌“工作区”

从意图活动访问片段方法

从 Java 调用 Powershell 脚本