4

I ran across this code in another post that almost does what I need, but can't figure out how to modify it to look for specific file types, i.e. *.bak, .txt, etc. I'm using Powershell with [System.IO.DirectoryInfo] because, like others have stated, using Get-ChildItem is too slow across the network. I thought it would just be something like $fileEntries = [IO.Directory]::GetFiles("C:\", ".bak"), but it still returns every file in every directory. --PS/.NET newbie

try
{
       $fileEntries = [IO.Directory]::GetFiles("C:\")
       [System.IO.DirectoryInfo]$directInf = New-Object IO.DirectoryInfo("C:\")
       $folders = $directInf.GetDirectories()
}
catch [Exception]
{
       $_.Exception.Message
       $folders = @()
 }

foreach($fileName in $fileEntries) 
{

      #[Console]::WriteLine($fileName); 

}

Remove-Variable -ErrorAction SilentlyContinue -Name fileEntries 

foreach($folder in $folders)
{
    recurse("C:\" + $folder + "\")
}
4

3 に答える 3

3

これにより、各拡張子がループして、ルートディレクトリとサブディレクトリ内のすべてのファイルが検索されます。特にC:\をルートとして実行している場合は、すべてのディレクトリに対して正しい権限を持っていることを確認してください。

$Extensions = @(".bak",".csv",".txt")

Foreach ( $Extension in $Extensions )
{
   [System.IO.Directory]::EnumerateFiles("C:\","*$Extension","AllDirectories")
}

この方法は、.Net4.0以降を実行しているPowershellでのみ機能します。.Netのバージョンを確認および更新するには:

$PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.4971
BuildVersion                   6.1.7600.16385
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

CLRVersion値は.netバージョンです。

構成ファイルを次のように更新します。

$Config = @"
<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0.30319"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>
"@

$Config > $PSHOME\Powershell.exe.config

Powershellセッションを再起動し、$PSVersionTable変数のCLRVersion値を確認​​します。

于 2013-02-20T07:42:47.707 に答える
-1

これは、.NET 4.0 Framework を使用する構成ファイルを作成した後に機能しました。

try{
    $path = "\\$Server\$($drive.replace(':','$'))"
    foreach ($filepath in [System.IO.Directory]::EnumerateFiles($path,"*.bak","AllDirectories"))
       {
          $file = New-Object System.IO.FileInfo($filepath)
          write-host $file
          # insert file into database table
       }
  }
catch [UnauthorizedAccessException]
  {
     $exception = $_.Exception.Message #I don't need to write/insert exception
  }
于 2013-02-25T22:31:10.637 に答える