gpt4 book ai didi

shell - 在powershell中检查文件是否可读且规则

转载 作者:行者123 更新时间:2023-12-03 01:05:53 25 4
gpt4 key购买 nike

我是 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

如果您正在使用 FileInfoDirectoryInfo对象(即 Get-ItemGet-ChildItem 或表示文件或目录的类似对象的输出),您将拥有 PSIsContainer属性将告诉您该项目是文件还是目录。

这可能涵盖了 99.999% 的案例。

但是,如果您需要知道某个文件是否为 NTFS 硬链接(hard link)(很少见,但最古老), NTFS junction to a directory , 一个 NTFS symlink , 一个 NTFS volume mount point , 或 any type of NTFS reparse point ,它变得复杂得多。 [ This answer很好地描述了前三个。]

让我们创建一个简单的 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

请注意, file1hfile1是硬链接(hard link),即使 file1不是这样创建的。

要清理上述垃圾,请执行以下操作:
Get-ChildItem -Path C:\linktest\ | ForEach-Object { $_.Delete() }

a bug in Remove-Item 删除一些阻止命令删除项目的容器链接。

一般的解决方案是获取该项目并对其进行测试:
# 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 is documented as reserved for future use . Windows 中没有设备文件类型。

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

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

关于shell - 在powershell中检查文件是否可读且规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48995968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com