Попытка использовать два массива в качестве переменных для поиска имен файлов (powershell) - PullRequest
0 голосов
/ 16 января 2020

Мне нужно найти в нескольких (именованных) папках на нескольких серверах файлы, соответствующие указанной дате c, и скопировать эти файлы в локальную папку с помощью Powershell. Количество папок не совпадает по размеру с массивами серверов. Т.е. мне нужно \ server1 \ interfacefolders \ folder1, \ server1 \ interfacefolders \ folder2, \ server2 \ interfacefolders \ folder1, \ server2 \ interfacefolders \ folder2, et c.

У меня есть следующие настройки в качестве массивов / Переменные, готовящиеся к этому, я думал, что "вложенные" циклы foreach будут работать, но это взрывает ... любые идеи, как начать это?:

[string[]]$ProdServerArray = "server1", "server2", "server3" 
[string[]]$InterfaceArray = "folder1", "folder2" "folder3" do {
$date = Read-host "Enter date (MM/DD/YYYY) : " } while ($date -as [datetime] -isnot [datetime]) 
$date = $date -as [datetime]

$destination = new-item c:\GetFilesResults\$($date.toshortdatestring().replace("/","-")) -type directory

$path = foreach ($ProdServer in $ProdServerArray) 
{   
    $folder = foreach ($Interface in $InterfaceArray)   
    {
    $file = "\\$path\InterfaceFolder\$folder\*"
    if ("$file".LastWriteTime -gt $date.date)
        {
           Copy-Item -Path $file.fullname -Destination $destination
        }
    }
}

Ответы [ 2 ]

1 голос
/ 16 января 2020

Прежде всего, вам не хватает запятой в строке:

[string []] $ InterfaceArray = "folder1", "folder2" "folder3"

Кроме того, насколько я могу судить, вы, пока l oop, похоже, ничего не добиваетесь, поскольку единственное время, которое когда-либо будет верно, - это если время 12:00:00 AM точно в указанную дату , Независимо от того, какую дату вы вводите в формате (ММ / ДД / ГГГГ), они не будут равны, если только я не сказал выше.

Поскольку вы выполняете поиск на нескольких серверах, Invoke-Command - ваш друг, так как foreach l oop будет действовать последовательно, в то время как это будет работать параллельно. Он будет отправлять команду поиска на каждый сервер одновременно.

Я не совсем уверен, что именно вы пытаетесь сделать, поэтому я не заполнил реальный код поиска (см. Ниже), но часть I оставьте пустым, чтобы указать, какое имя файла / схему имени файла вы ищете. Если вы предоставите больше ясности, я могу помочь вам в случае необходимости.

(Примечание: $ filepath , хотя и говорит само за себя, это пути к файлам, которые вы будете sh искать. Вы можете сгенерировать их таким же образом, как в Lee_Dailey . Я бы порекомендовал удалить разделительные линии и сохранить сгенерированные пути к объекту String System.Array )

Invoke-Command -ComputerName $ProdServerArray -ScriptBlock {Get-Childitem –Path $filepath -Recurse -ErrorAction SilentlyContinue |where {<your code here>}}
1 голос
/ 16 января 2020

для построения полных имен папок из этих двух массивов, вы можете использовать два вложенных цикла foreach. как только у вас есть значения, вы можете построить пути с помощью оператора строкового формата -f.

я пропустил остальную часть вашего кода, так как он, похоже, не относится к заданному вами вопросу. [ ухмылка ]

$ProdServerArray = 'serverAAA', 'serverBbBbBb', 'server_CCC'
$InterfaceArray = 'folder1', 'folder2', 'folder3', 'folder666'

foreach ($PSA_Item in $ProdServerArray)
    {
    foreach ($IA_Item in $InterfaceArray)
        {
        '\\{0}\InterfaceFolders\{1}' -f $PSA_Item, $IA_Item
        }
    '=' * 30
    }

вывод ...

\\serverAAA\InterfaceFolders\folder1
\\serverAAA\InterfaceFolders\folder2
\\serverAAA\InterfaceFolders\folder3
\\serverAAA\InterfaceFolders\folder666
==============================
\\serverBbBbBb\InterfaceFolders\folder1
\\serverBbBbBb\InterfaceFolders\folder2
\\serverBbBbBb\InterfaceFolders\folder3
\\serverBbBbBb\InterfaceFolders\folder666
==============================
\\server_CCC\InterfaceFolders\folder1
\\server_CCC\InterfaceFolders\folder2
\\server_CCC\InterfaceFolders\folder3
\\server_CCC\InterfaceFolders\folder666
==============================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...