当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

作者:精品下载站 日期:2024-12-14 13:04:50 浏览:12 分类:玩电脑

验证 PowerShell 以检查文件是否存在(示例)


您是否使用 PowerShell 创建、读取、更新和删除文件?如果是这样,当目标文件不存在或已经存在时,您可能会遇到错误。幸运的是,PowerShell 中有一些方法可以在对文件执行任何操作之前检查文件是否存在。

例如,与其让代码立即创建文件,不如测试该文件是否已存在。如下图所示,您可以编写更好的代码并获得清晰的输出。

[玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

在本文中,您将了解使用 PowerShell 检查文件是否存在的不同方法。您还将学习如何使用这些方法中的每一种来通过错误处理逻辑生成更好的代码和结果。

先决条件

使用自助密码重置解决方案减少服务台呼叫并更新远程用户的缓存凭据,即使在 VPN 之外也是如此。获取 Specops uReset 演示!

本文是一个操作指南,您将从不同的示例中学习。要遵循这些示例,您将需要以下内容:

  • 代码编辑器。推荐的工具是跨平台工作的 Visual Studio CodeAtom。如果您使用的是 Windows 计算机,还可以使用 Windows PowerShell ISE。
  • Windows PowerShell 5.1(桌面版)或PowerShell 7.1(核心版)。本文中的命令和脚本适用于两个 PowerShell 版本。无论您使用的是 Windows、Linux 还是 macOS,只要安装了 PowerShell 就可以了。

相关:如何在 Windows、Linux 和 macOS 上下载并安装 PowerShell 7

使用PowerShell检查文件是否存在

本文介绍使用 PowerShell 检查文件是否存在的三种方法。这三种方法的用途不同,但概念和最终目标是相同的。这三种方式是:

  • 测试路径 Cmdlet。
  • Get-ItemGet-ChildItem Cmdlet。
  • System.IO.File 类。

这三种方法都会有示例和演示,包括如何使用它们进行错误处理。

使用测试路径

第一种方法是 Test-Path cmdlet,专门用于确定路径或文件是否存在。使用此 cmdlet 测试文件是否存在时,结果为 truefalse。结果表明文件是否存在。

以下是使 Test-Path cmdlet 用于检查文件的基本语法。

Test-Path -Path <PATH to FILE> -PathType Leaf

例如,如果您需要检查名为 C:\temp\important_file.txt 的文件是否存在,请使用以下代码。请注意,-PathType Leaf 部分告诉 cmdlet 显式检查文件而不是目录。

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

当您在 PowerShell 中运行上述命令时,如果文件存在,结果将返回 True。否则,结果将为False,如下面的屏幕截图所示。

[玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

相关:如何使用 PowerShell Test-Path Cmdlet

示例:如果文件不存在则创建该文件

此示例是在指定位置创建文件的典型用例。为了避免“文件已存在”错误,脚本在创建文件之前检查文件是否已存在。如果该文件存在,脚本会显示一条消息,并且不再尝试创建该文件。

复制下面的代码并将其保存在名为 Create-NewFile.ps1 的文件中。如果您想更改文件的输出位置,请确保更改 $path 变量的值。保存脚本后,在PowerShell中运行它进行测试。

# Create-NewFile.ps1

# Full path of the file
$file = 'c:\temp\important_file.txt'

#If the file does not exist, create it.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# If the file already exists, show the message and do nothing.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

下面的屏幕截图显示了两种不同的输出。第一个是在文件不存在时运行脚本时。第二个是创建文件之后,并且它已经存在。

[玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

相关:回归基础:如何运行 PowerShell 脚本

使用 Get-Item 和 Get-ChildItem

Get-Item cmdlet 的用途是获取指定位置的项目。相比之下,Get-ChildItem cmdlet 用于获取一个或多个指定位置中的项目和子项目。这两个 cmdlet 的功能并未明确检查文件是否存在。

当您使用 Get-ItemGet-ChildItem 获取不存在的项目时会发生什么?对于每个丢失的文件,您都会收到错误消息。以下面的命令为例。

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

假设文件c:\temp\important_file.txt不存在。上面的每个命令都会返回一个错误。从下面的示例中可以看出,两个命令的错误消息是相同的。

[玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

示例:归档现有文件并创建新文件

在此示例中,脚本使用 Get-ItemTest-Path cmdlet。该脚本的逻辑是执行以下操作:

  • 使用 Test-Path 测试存档文件夹是否存在。

    • 如果存档文件夹不存在,脚本将创建一个以下格式的新存档文件夹 - yyyy-MMM-dd_hh-mm-ss-tt
  • 然后,脚本将旧文件移动到存档文件夹。
  • 使用 Get-Item 测试文件是否已存在。

    • 如果文件存在,脚本首先将其移动到存档文件夹。然后该脚本在原始位置创建新文件。
  • 如果该文件不存在,脚本将创建新文件。
  • 复制下面的代码并将其另存为Create-NewFileAfterArchive.ps1。保存脚本后,在 PowerShell 中运行它并验证结果。

    # Create-NewFileAfterArchive.ps1
    
    # Full path of the file
    $file = 'c:\temp\important_file.txt'
    
    #Full path to the archiving folder
    $archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"
    
    # If the file exists, move it to the archive folder, then create a new file.
    if (Get-Item -Path $file -ErrorAction Ignore) {
        try {
            ## If the Archive folder does not exist, create it now.
            if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
                $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
            }
            ## Move the existing file to the archive.
            Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
            Write-Host "The old file [$file] has been archived to [$archiveFolder]"
         } catch {
            throw $_.Exception.Message
         }
     }
     Create the new file
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The new file [$file] has been created."
     } catch {
        Write-Host $_.Exception.Message
     }

    提示:-ErrorAction Ignore 参数会抑制错误(不会在控制台中显示),并且不会将错误记录到 $error 自动变量嗯>。

    在下面的屏幕截图中,第一个脚本运行创建了文件 c:\temp\important_file.txt。 随后的脚本执行每次都会创建一个新的存档文件夹,将现有文件移动到存档文件夹,然后然后在c:\temp\important_file.txt 中创建一个新文件。

    [玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

    使用 [System.IO.File]::Exists() .NET 方法

    本文要学习的最后一个方法是 System.IO.File .NET 类,特别是 Exists() 方法。 PowerShell 的优势之一是能够导入和使用 .NET 类和方法。

    例如,要在 PowerShell 中使用 Exists() 方法检查文件是否存在,请使用以下代码。

    [System.IO.File]::Exists("PATH")

    上述方法产生一个布尔结果 - truefalse。如果结果返回true,则表示目标文件存在。否则,当目标文件不存在时,返回结果为false

    在下面的示例代码中,该命令检查文件 c:\temp\important_file.txt 是否存在。

    $file = 'c:\temp\important_file.txt'
    [System.IO.File]::Exists($file)
    

    从下面的结果可以看到,结果返回true,确认文件存在。

    [玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

    通过此 .NET 方法,您还可以使用三元运算,如下例所示。您可以使用更短的实现来自定义结果消息,而不是显示默认的 true 或 false 结果。但是,本示例中的三元运算符仅适用于 PowerShell 7+。

    $file = 'c:\temp\important_file.txt'
    [System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

    示例:如果文件存在则更新文件内容

    此示例脚本通过附加新的 GUID 值来更新文本文件。但是,仅当文件存在时才会进行内容更新。否则,脚本将显示一条消息并且不执行任何其他操作。

    复制下面的脚本并将其另存为 Update-FileContents.ps1。如果需要,请更改 $file 变量的文件路径值。然后在PowerShell中运行脚本进行测试。

    # Update-FileContents.ps1
    
    #Full path of the file
    $file = 'c:\temp\important_file.txt'
    
    # If the file exists, append a new GUID value in the file.
    if ([System.IO.File]::Exists($file)) {
        try {
            $newValue = ((New-Guid).Guid)
            Add-Content -Path $file -Value $newValue -ErrorAction STOP
            Write-Host "The file [$file] has been updated with [$newValue]"
         } catch {
            throw $_.Exception.Message
         }    
     }
    
    # If the file does not exist, show a message and do nothing.
     else {
         Write-Host "The file [$file] could not be updated because it does not exist."
     }

    您可以在下面的屏幕截图中看到,脚本在每次运行期间都会更新文件。发生更新是因为 [System.IO.File]::Exists() 方法确认文件 c:\temp\important_file.txt 存在。

    最后,使用命令 gc c:\temp\important_file.txt 读取文件内容,确认脚本已使用 GUID 值更新了文件。

    [玩转系统] 验证 PowerShell 以检查文件是否存在(示例)

    相关:使用 PowerShell 数据类型加速器加速编码

    结论

    使用自助密码重置解决方案减少服务台呼叫并更新远程用户的缓存凭据,即使在 VPN 之外也是如此。获取 Specops uReset 演示!

    在本文中,您了解了使用 PowerShell 检查文件是否存在的方法不止一种。在进行任何与文件相关的修改之前,最好检查文件是否存在。

    您已了解如何使用 cmdlet Get-ItemGet-ChildItemTest-Path。以及 [System.IO.File]::Exists() .NET 方法。这些示例向您展示了如何使用技术以及如何将它们与错误处理逻辑相结合。

    停止忍受这些错误消息。通过在任何与文件相关的操作之前添加代码来检查文件是否存在来克服这些问题。您在这里学到的技术仅涵盖基础知识,现在就取决于您如何改进它们。

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯