在powershell中检查文件是否可读且正常

2024-05-11

我是 powershell 新手,我想检查文件是否可读且正常。在 unix 中,我们可以使用 -f 和 -r 在一行中完成此操作。例如,以下 shell 脚本函数接受文件名作为参数并检查文件的可读性和规律性,与此等效的 powershell 是什么?

_ChkRegularFile_R()        # checks whether a file is regular and readable
{   
    _CRFRfilename=$1                    # name of the file to be checked

_CRFRsts=1                          # default is error

if [ -f "$_CRFRfilename" ]
then
    if [ -r "$_CRFRfilename" ]
    then
        _CRFRsts=0        # success: regular file is readable
    fi
fi

return $_CRFRsts
}

要测试文件是否可读,您可以尝试打开它。如果出现错误,则该文件不可读。您需要根据需要捕获或捕获异常或因错误而停止。请记住,Windows 会锁定打开以进行写入的文件,因此应用程序需要预料到它们有时无法打开文件。

如果确实有必要,您可以使用类似的方法来测试是否可以读取文件:

try {
    [System.IO.File]::OpenRead($FullPathName).Close()
    $Readable = $true
}
catch {
    $Readable = $false        
}

这是为了测试您是否可以写入文件:

try {
    [System.IO.File]::OpenWrite($FullPathName).Close()
    $Writable = $true
}
catch {
    $Writable = $false        
}

如果您确实需要的话,该逻辑很容易包装到函数中。

就文件类型而言,Windows 文件系统中的几乎所有内容都是普通文件或目录,因为 Windows 没有“一切都是文件”约定。所以,通常你可以按如下方式进行测试:

# Test if file-like
Test-Path -Path $Path -Leaf

# Test if directory-like
Test-Path -Path $Path -Container

如果您正在与FileInfo or DirectoryInfo对象(即,输出Get-Item, Get-ChildItem,或代表文件或目录的类似对象)您将拥有PSIsContainer属性将告诉您该项目是文件还是目录。

这可能涵盖了 99.999% 的情况。


但是,如果您需要知道某个文件是否是到文件的 NTFS 硬链接(罕见,但最古老),NTFS 到目录的连接 https://en.wikipedia.org/wiki/NTFS_junction_point, an NTFS符号链接 https://en.wikipedia.org/wiki/NTFS_symbolic_link, an NTFS卷安装点 https://en.wikipedia.org/wiki/NTFS_volume_mount_point, or 任何类型的 NTFS 重分析点 https://en.wikipedia.org/wiki/NTFS_reparse_point,事情变得更加复杂。 [这个答案 https://stackoverflow.com/a/48586946/696808很好地描述了前三个。]

让我们创建一个简单的 NTFS 文件夹来测试:

# Create a test directory and change to it.
New-Item -Path C:\linktest -ItemType Directory | Select-Object -ExpandProperty FullName | Push-Location

# Create an empty file
New-Item -Path .\file1 -ItemType file -Value $null | Out-Null
New-Item -Path .\file2 -ItemType file -Value $null | Out-Null

# Create a directory
New-Item -Path .\dir1 -ItemType Directory | Out-Null

# Create a symlink to the file
New-Item -ItemType SymbolicLink -Path .\sfile1 -Value .\file1 | Out-Null

# Create a symlink to the folder
New-Item -ItemType SymbolicLink -Path .\sdir1 -Value .\dir1 | Out-Null

# Create a hard link to the file
New-Item -ItemType HardLink -Path .\hfile1 -Value .\file1 | Out-Null

# Create a junction  to the folder
New-Item -ItemType Junction -Path .\jdir1 -Value .\dir1 | Out-Null

# View the item properties
Get-ChildItem -Path . | Sort-Object Name | Format-Table -Property Name, PSIsContainer, LinkType, Target, Attributes -AutoSize

你的输出将是:

Name   PSIsContainer LinkType     Target                            Attributes
----   ------------- --------     ------                            ----------
dir1            True              {}                                 Directory
file1          False HardLink     {C:\linktest\hfile1}                 Archive
file2          False              {}                                   Archive
hfile1         False HardLink     {C:\linktest\file1}                  Archive
jdir1           True Junction     {C:\linktest\dir1}   Directory, ReparsePoint
sdir1           True SymbolicLink {C:\linktest\dir1}   Directory, ReparsePoint
sfile1         False SymbolicLink {C:\linktest\file1}    Archive, ReparsePoint

请注意,两者file1 and hfile1是硬链接,尽管file1并不是这样创建的。

要清理上述垃圾,请执行以下操作:

Get-ChildItem -Path C:\linktest\ | ForEach-Object { $_.Delete() }

There's 中的一个错误Remove-Item https://github.com/powershell/powershell/issues/621删除一些容器链接,这会阻止命令删除项目。

一般的解决方案是获取该项目并对其进行测试:

# Get the item. Don't use Get-ChildItem because that will get a directory's contents
$Item = Get-Item -Path $Path

# Is it a container
$Item.PSIsContainer

# Is it a link of some kind?
[System.String]::IsNullOrWhiteSpace($Item.LinkType)
$Item.LinkType -eq 'Junction'

# Is it a Reparse Point?
($Item.Attributes -band [System.IO.FileAttributes]::ReparsePoint) -eq [System.IO.FileAttributes]::ReparsePoint

还有其他几个潜在的属性:

PS> [System.Enum]::GetNames([System.IO.FileAttributes])
ReadOnly
Hidden
System
Directory
Archive
Device
Normal
Temporary
SparseFile
ReparsePoint
Compressed
Offline
NotContentIndexed
Encrypted
IntegrityStream
NoScrubData

注意Device被记录为保留供将来使用 https://msdn.microsoft.com/en-us/library/system.io.fileattributes(v=vs.110).aspx。 Windows 中没有设备文件类型。

对于卷安装点,我不能 100% 确定它们的外观。我知道您可以在 Windows 8.1 及更高版本上创建它们Get-Partition随后是适当的Add-PartitionAccessPath,但我目前使用的是 Windows 7。恐怕我现在没有办法对此进行测试。

最后,我不知道 Linux 上的 PowerShell Core 6.0 到底如何处理文件类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在powershell中检查文件是否可读且正常 的相关文章

随机推荐

  • 什么是“多重”启动模式?

    On http developer android com guide topics manifest activity element html http developer android com guide topics manife
  • 如何从 SD 卡中删除文件

    我正在创建一个文件作为电子邮件的附件发送 现在我想在发送电子邮件后删除图像 有没有办法删除文件 我努力了myFile delete 但它没有删除该文件 我在 Android 上使用此代码 因此编程语言是 Java 使用通常的 Android
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 使用条件在 pandas 数据框中生成新列

    我有一个 pandas 数据框 如下所示 portion used 0 1 1 0 1 2 0 3 2 3 0 0 3 4 0 8 我想根据以下内容创建一个新专栏used列 以便df看起来像这样 portion used alert 0 1
  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • ParseFromString 在 IE 中抛出错误,但在 Chrome 中不会抛出错误

    我正在使用传单的 KML 插件 该插件在 Google Chrome 中运行良好 然而 在 IE 中 它会在以下代码中引发错误 parser new DOMParser console log url outputs path to kml
  • (venv) (base) 都在 python 项目上活跃,我如何只进入 venv?

    所以我将 vscode 与 conda 对于 django 项目 一起使用 并尝试激活名为 venv 的虚拟环境 它来自 base C Users User Desktop pfa master pfa master venv Script
  • 检测 UITableViewCell 何时离开屏幕

    我正在实施一个丰富的UITableView与定制创建UITableViewCell 我以一种方式在屏幕上显示这些 但是一旦它们离开屏幕 我想记下这一点 因为它们第二次出现时我希望它们以不同的方式显示 认为离开屏幕时自动 标记为已读 我一直在
  • 使用枚举名称而不是值对 Pydantic 字段进行编码

    我有一个枚举类 class Group enum Enum user 0 manager 1 admin 2 我有一个 pydantic 模型 class User BaseModel id int username str group G
  • 设置 LinearLayout 的最大宽度

    如何设置水平线的最大宽度LinearLayout 因此 如果内容较短 例如某些文本 布局会缩小 如果内容较长 则布局不会扩展超过某个最大宽度值 我更喜欢在 XML 级别执行此操作 这就是我所需要的超出了之前答案中的建议 https stac
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • MapKit 注释未显示在地图上

    我无法让 MKAnnotationViews 显示在 MapKit 的地图上 我正在使用 iOS 7 现在已经在论坛和网络上搜索了很多小时 尝试不同的示例和设置 下面我有 我认为 使其工作的最基本的设置 该应用程序包含一个 ViewCont
  • 更改哈希值而不触发 hashchange 事件

    我使用哈希来动态加载内容 为了使后退按钮正常工作 我正在捕获哈希更改 然而 有时我需要更改哈希值而不触发哈希更改函数 例如 当页面重定向到服务器端时 我需要在内容返回后更新哈希值 我想出的最佳解决方案是取消绑定 hashchange 事件
  • 有没有办法将样式强制应用到已经具有 style="" 属性的 div 元素

    我正在尝试对我无法控制的 HTML 输出进行皮肤处理 其中一个元素是div with a style overflow auto 属性 CSS 有没有办法强制这样做div to use overflow hidden 你可以加 import
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • svn:使用vim合并冲突

    我正在尝试看看如何使 svn 中的合并变得容易 This page http svnbook red bean com en 1 7 svn advanced externaldifftools html提到可以使用外部工具进行合并 vim
  • SWIG C 函数指针和 JAVA

    我有一些 C 代码 其中一个方法有一个函数指针作为参数 我正在尝试在我的 Android 应用程序中使用 C 代码 我决定使用 SWIG 来完成生成我需要的 java 文件的所有工作 一切都适用于常规函数 没有函数指针作为参数的函数 但我不
  • Rails 3.2 开发模式不显示带有回溯等的完整错误页面

    我刚刚升级到 Rails 3 2 一切正常 除了错误页面不再显示正常的开发调试信息 相反 它显示标准生产错误页面 白色背景 中间有红色文本 很抱歉 出了点问题 我们已收到有关此问题的通知 我们会尽快查看 Rails 3 2 是否有新的设置或
  • 如何使用 Typescript 设置 Material-UI for React?

    我在将 Material UI 添加到我的 React 项目中时遇到了一些问题 该项目是用 Typescript 编程的 根据教程 我首先添加react tab event plugin import injectTapEventPlugi
  • 在powershell中检查文件是否可读且正常

    我是 powershell 新手 我想检查文件是否可读且正常 在 unix 中 我们可以使用 f 和 r 在一行中完成此操作 例如 以下 shell 脚本函数接受文件名作为参数并检查文件的可读性和规律性 与此等效的 powershell 是