为什么Get-ChildItem命令无法从C#程序读取C驱动器?

时间:2019-01-30 06:14:17

标签: c# powershell

$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();
}

在C#程序中运行PowerShell脚本时,它会跳过C:驱动器中的搜索。

1 个答案:

答案 0 :(得分:0)

我认为问题出在-Path $_.DeviceID上。由于$_.DeviceID并不是完整的路径,而只是像'C:'之类的东西,因此PowerShell试图解释您的意思,并且我认为它默认为该驱动器的工作目录(例如{{1的值}}。

解决此问题的一种方法是在枚举之前运行$pwd,并将Set-Location "$($_.DeviceID)\"参数从调用中移至-Path。那就是:

Get-ChildItem