Чтобы обратиться к списку элементов, будь то файлы или имена компьютеров, вам нужно использовать так называемый массив.
Вы можете создать массив разными способами, в вашем случае лучше всего создайте список в текстовом файле, а затем в 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$
серверов.
Фрагмент должен работать, но я не проверял его сам. Сообщите мне, если есть какие-либо ошибки.
Пожалуйста, проверьте и не стесняйтесь спрашивать, если у вас есть какие-либо дополнительные вопросы.