Почему команда Get-ChildItem не читает диск C из программы C #? - PullRequest
0 голосов
/ 30 января 2019
$archive = ("*www*","*Backup*","*inetpub*","*wwwroot*","*archive*","*Archive*","*ARCHIVE*","*WINDOWS*","*Program Files*","*JioMediaShare*","*thumbnails*");

function Log-Message {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$LogMessage
    )
    Write-Output ("{0} - {1}" -f  (Get-Date), $LogMessage)
}

function Exclude-Directories {
    Process {
        $allowThrough = $true
        foreach ($directoryToExclude in $archive) {
            $directoryText = "*\" + $directoryToExclude
            $childText = "*\" + $directoryToExclude + "\*"
            if (($_.FullName -like $directoryText -and $_.PsIsContainer) -or $_.FullName -like $childText) {
                $allowThrough = $false
                break
            }
        }
        if ($allowThrough) {
            return $_
        }
    }
}

Log-Message "Starting Search"
Get-WMIObject Win32_LogicalDisk | ForEach-Object {
    Log-Message $_.DeviceID
    Get-ChildItem -Path  $_.DeviceID -Include *.jpg, *.png, *.bmp, *.jpeg, *.gif, *.webp -Recurse |
        Exclude-Directories |
        where {!$_.PSIsContainer} |
        Select-Object FullName, Name, BaseName, CreationTime, LastWriteTime, Length |
        Export-Csv -NoTypeInformation -Path Images.csv -Encoding UTF8 -Append |
        % {$_.Replace('"','')}
}
Log-Message "Search completed."

Если я запускаю вышеуказанный скрипт независимо, этот скрипт запускается без ошибок и выполняет поиск образов на диске C :,: и E:

string text = System.IO.File.ReadAllText(@"New-Item.ps1");

using (PowerShell PowerShellInstance = PowerShell.Create()) {
    // use "AddScript" to add the contents of a script file to the end of the execution pipeline.
    // use "AddCommand" to add individual commands/cmdlets to the end of the execution pipeline.
    PowerShellInstance.AddScript(text);

    Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
    foreach (PSObject outputItem in PSOutput) {
        // if null object was dumped to the pipeline during the script then a null
        if (outputItem != null) {
            Console.WriteLine(outputItem.BaseObject.ToString() + "\n");
        }
    }
    if (PowerShellInstance.Streams.Error.Count > 0) {
        Console.Write("Error");
    }
    Console.ReadKey();
}

При запуске скрипта PowerShell в C #программа пропускает поиск на диске C:

1 Ответ

0 голосов
/ 30 января 2019

Я думаю, что проблема с -Path $_.DeviceID.Поскольку $_.DeviceID не полный путь, а просто что-то вроде «C:», PowerShell пытается интерпретировать то, что вы имеете в виду, и я думаю, что по умолчанию используется рабочий каталог для этого диска (например, значение $pwd).

Один из способов обойти это - запустить Set-Location "$($_.DeviceID)\" перед перечислением и сбросить параметр -Path из вызова на Get-ChildItem.То есть:

Set-Location "$($_.DeviceID)\"

Get-ChildItem -Include *.jpg, *.png, *.bmp, *.jpeg, *.gif, *.webp -Recurse ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...