powershell测试隐藏和系统文件

时间:2017-10-11 02:11:43

标签: file powershell system hidden


我希望从我的驱动器递归获取所有文件,并使用system.io.directory中的enumeratefiles,如下所示:

public List<Employees> GetEmployees()
{
    SqlCommand cmd = new SqlCommand("select * from Employees T where T.Account_ID in (select A.Account_ID from Accounts A where Empl_ID = 1)", con);

    con.Open();

    SqlDataReader dr = cmd.ExecuteReader();

    if (dr.HasRows)
    {

工作正常,但很多行都包含隐藏文件或系统文件。
我使用了ennumeratefiles,因为j:驱动器非常大,这个函数比同等的PowerShell cmdlet工作得快,效果好。

如何测试这些文件类型?

有关如何从enumeratefiles中为c ++排除这些文件类型的内容,但也不包括powershell,我不知道如何更改powershell的代码:
c++ file hidden or system

2 个答案:

答案 0 :(得分:0)

使用System.IO.FileInfo和一点-bor枚举魔法将让您想要。

下面的示例将打印包含属性HiddenSystem的任何项目的完整路径。

$hidden_or_system = [System.IO.FileAttributes]::Hidden -bor [System.IO.FileAttributes]::System

[System.IO.Directory]::EnumerateFiles("J:\","*","AllDirectories") | ForEach-Object {
    if ([System.IO.FileInfo]::new($_).Attributes -band $hidden_or_system) {
        "A hidden or system item: $_"
    }
}

请注意,如果您遇到无权访问终止错误的文件或文件夹将停止执行,您可以通过恢复到内置cmdlet来解决此问题,因为它们会抛出非终止错误并继续。

$hidden_or_system = [System.IO.FileAttributes]::Hidden -bor [System.IO.FileAttributes]::System

Get-ChildItem -Path 'J:' -Recurse -Force | ForEach-Object {
    if ($_.Attributes -band $hidden_or_system) {
        "A hidden or system item: $($_.FullName)"
    }
}

答案 1 :(得分:0)

感谢您的建议。

当您获得&#34;隐藏&#34;的文件属性时文件有时候powershell会抛出一个非终止错误。

我使用以下建议解决了问题:

[System.IO.Directory]::EnumerateFiles("J:\","*","AllDirectories")|out-file -Encoding ascii $outputfile
foreach($line in select-string -Path $outputfile) {
  # Some of the $line is the name of a hidden or system file
  if ((Get-ItemProperty $line -ErrorAction SilentlyContinue).attributes -band [io.fileattributes]::Hidden) {continue}
  if (-not $?) {continue}
  # Is the file a system file?
  if ((Get-ItemProperty $line -ErrorAction SilentlyContinue).attributes -band [io.fileattributes]::System) {continue}
  if (-not $?) {continue}
  #
  # Do the work here...
  #
}