Get-ChildItem с несколькими путями через переменную - PullRequest
3 голосов
/ 16 октября 2019

Этот немного меня озадачивает. Я обычно чувствую себя достаточно продвинутым в PowerShell, но я просто не понимаю нюанс этого.

Это работает

$LogFiles = Get-ChildItem -Path c:\windows\temp\*.log,c:\temp\*.log,C:\programdata\Microsoft\IntuneManagementExtension\Logs\*.log

И все же, что я хочу сделать (и не работает), это:

$LogsToGather = "c:\windows\temp\*.log,c:\temp\*.log,C:\programdata\Microsoft\IntuneManagementExtension\Logs\*.log"
$LogFiles = Get-ChildItem -Path "$($LogsToGather)" -Recurse

Я пытался сделать VAR массивом, япопробовал несколько вещей с созданием строки. Мне удалось обойти эту проблему, но я исключительно заинтересован в том, чтобы понять, какой тип данных-путь принимает с этим общим разграничением, и иметь возможность создавать его динамически.

Кажется, что уловка заключается в том, что командлет принимает разграничение запятыми. Можно ли его воссоздать, используя какой-нибудь массив, хеш-таблицу и т. Д.?

Кто-нибудь знает?

1 Ответ

7 голосов
/ 16 октября 2019

Да, $LogsToGather должен быть массивом строк, чтобы ваша команда работала:

$LogsToGather = 'c:\windows\temp\*.log', 'c:\temp\*.log', 'C:\programdata\Microsoft\IntuneManagementExtension\Logs\*.log'

Обратите внимание, как элементы массива, разделенные ,, должны заключаться в кавычки индивидуально (см. Нижнюю часть).


Get-Help с -Parameter - это быстрый способ проверить тип данных, который ожидает данный параметр:

PS> Get-Help Get-ChildItem -Parameter Path

-Path <String[]>
    Specifies a path to one or more locations. Wildcards are permitted. The default location is the current directory (`.`).

    Required?                    false
    Position?                    0
    Default value                Current directory
    Accept pipeline input?       True (ByPropertyName, ByValue)
    Accept wildcard characters?  false

String[] представляет массив ([]) [string] (System.String) экземпляров - см. about_Command_Syntax .

Для получения дополнительной информации о Get-ChildItem см. документы .


Что касается то, что вы пытались :

$LogsToGather = "c:\windows\temp\*.log,c:\temp\*.log,C:\programdata\Microsoft\IntuneManagementExtension\Logs\*.log"

Этосоздает одну строку, которая при передаче Get-ChildItem равна в целом , интерпретируемую как одиночный путь, который, очевидно, не будет работать.

Обратите внимание, что указывает элементы массива без кавычек , например:

Get-ChildItem -path c:\windows\temp\*.log, c:\temp\*.log, ...

поддерживается только в том случае, если вы передаете массив в качестве аргумента команды , не в контексте создания массива с выражением , таким как $LogsToGather = 'foo', 'bar', ..

Причина в том, что PowerShell имеет два основных режима синтаксического анализа - режим аргумента и режим выражения , как объяснено в этот ответ ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...