Запросить помощь в написании сценария PS для поиска списка файлов (путь + имя файла) по всем Windows серверам в моей среде - PullRequest
0 голосов
/ 21 апреля 2020

Что я пытаюсь выполнить sh:

  1. Создайте сценарий PS для запуска с одного компьютера администратора, но выполняйте поиск по C $ на всех Windows серверах в AD.
  2. Поиск указанного c списка путей \ имен файлов, которые я предоставляю.
  3. Если ЛЮБОЙ из указанного c списка путей \ имен файлов найден на сервере, ТО выводит сервер name и paths \ filenames к файлу * .CSV с именем «Badfiles.csv» на машине администратора.

Пытался построить из следующего синтаксиса, но по общему признанию мой старый мозг не хорош в этом вещи, и я указал только один файл здесь - как я могу обратиться к списку нескольких путей \ файлов? Спасибо за помощь старой леди. :)

$name= gc env:computername
$computers= get-content -path C:\Windows\Temp\v.bat
$csvfile = "c:\temp\$badfiles.csv" 
foreach ($computer in $computers) {
    "\$computer\C$\" | Get-ChildItem -recurse -filter "*.bat"
}

1 Ответ

0 голосов
/ 22 апреля 2020

Чтобы обратиться к списку элементов, будь то файлы или имена компьютеров, вам нужно использовать так называемый массив.

Вы можете создать массив разными способами, в вашем случае лучше всего создайте список в текстовом файле, а затем в Powershell вы прочитаете содержимое списка, используя get-content, сохраните результат в переменной, и он будет автоматически сохранен в виде массива!

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

Теперь самая важная часть того, чего вы хотите достичь, не ясна. Позвольте мне объяснить.

Чтобы проверить, существует ли файл, вы можете использовать test-path. Это вернет true или false, и вы сможете действовать в соответствии с результатом. Вам нужно определить точный путь и имя файла, чтобы проверить, чтобы это работало.

Если вы не знаете точных имен и путей файлов, которые необходимо проверить, вы можете использовать Get-ChildItem так же, как вы сделали в коде, который вы предоставили. Предостережение заключается в том, что вы должны максимально сузить область поиска файлов. В вашем примере вы ищете расширение файла .bat на всей машине, и это может привести к некоторым проблемам. Типичный диск C будет иметь сотни тысяч, если не миллионы файлов и папок. Разбор всех из них может занять много времени.

Так что это важное различие, которое нужно понять, и что вызывает замешательство для меня, это то, что вы говорите в "2. Search for a specific list of paths\filenames that I provide...", но в коде, который вы используете Get-ChildItem, чтобы получить все файлы вместо предоставления списка имен файлов.

Далее я предполагаю, что у вас есть список имен файлов с точными известными путями.

Теперь в вашем данном коде я вижу, что вы нашли некоторые из правильные команды, но они должны быть расположены по-разному для получения необходимых результатов.

Пожалуйста, просмотрите этот пример кода, который может помочь вам в дальнейшем:

Пример ComputerList.txt содержимое файла (список имен хостов компьютера) проверить):

computer1
serverXYZ
laptop123

Пример FileList.txt содержимое файла (Список файлов для проверки на каждом из указанных компьютеров):

c:\temp\virus.bat
c:\games\game.exe
c:\Pictures\personal.jpg

Теперь код PowerShell:

# Gets the list of items from TXT files and saves them as arrays in variables
$ComputerNames = Get-Content 'c:\temp\ComputerList.txt'
$FileList = Get-Content 'c:\temp\FileList.txt'

# Define the path and name of CSV report
$BadFiles = "c:\temp\badfiles.csv"

# Define the foreach loop that will iterate through each hostname in computer list
foreach($computer in $ComputerNames){
    # Define foreach loop that will iterate through each file in the list and test their path in the current computer in the current iteration
    foreach($file in $FileList){
        # Test the path of the current file in the loop and append the CSV file if it was found
        # Convert the file path to C$ share path
        $file = $file -replace("c:","c$")
        # Define path of file to test
        $FileToTest = "\\$computer\$file"
        if (test-path $FileToTest -ErrorAction SilentlyContinue){
            # This block will run only when a bad file has been found
            # This part can be tricky but it is used to make sure we properly format the current bad file entry when we append it to the resulting CSV file
            $BadFile = "" | select Computer,File

            # Save information about current computer
            $BadFile.computer = $computer

            # Save information about current file
            $BadFile.file = $file

            # Append the entry to an array of found bad files
            $BadFileList += $badfile 

        }
    }
}
# When done iterating through every computer and file, save the results in a CSV file
$BadFileList | ConvertTo-Csv -NoTypeInformation | Out-File $BadFiles

Выше приведен фрагмент кода, который вы можете протестировать и запустить в своей среде. Сначала создайте два файла TXT и убедитесь, что вы запускаете PowerShell с соответствующими разрешениями для доступа к сетевым ресурсам C$ серверов.

Фрагмент должен работать, но я не проверял его сам. Сообщите мне, если есть какие-либо ошибки.

Пожалуйста, проверьте и не стесняйтесь спрашивать, если у вас есть какие-либо дополнительные вопросы.

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