У меня есть сценарий powershell, который должен перемещаться по папкам и подпапкам указанного каталога. Как только на самом низком уровне (когда больше нет подпапок, а только файлы), он будет обрабатывать файлы. Для моего примера, давайте предположим, что у меня есть следующие папки и файлы:Ошибка при попытке навигации по папке, подпапкам и файлам
C: \ Temp \ filder1 \ file1.txt
C: \ Temp \ filder2 \ file2.txt
C: \ TEMP \ filder3 \ file3.txt
Проблема возникает, когда я пытаюсь перейти из папки нижнего уровня в файлы обработки в этой папке: $ files = Get-ChildItem $ folder. Кажется, что каким-то образом папка объекта преобразуется в просто строку с именем папки. Я получаю сообщение об ошибке, которое теперь использует мой путь по умолчанию пользователя с добавленным именем папки, который, конечно же, терпит неудачу, потому что теперь такая папка существует в моем пути по умолчанию. Ошибка - это что-то вроде:
Get-ChildItem: Не удается найти путь 'C: \ Users \ my.name \ Documents \ Powershell \ Powershell_Scripts \ folder1', потому что он не существует.
Путь я бы ожидать, это «C: \ Temp \ folder1»
Вот упрощенная версия моего сценария:
Param(
[Parameter(Position = 1)] [string] $source_share_full_path = "c:\temp\" # path to a top-level share
)
$folders = Get-ChildItem $source_share_full_path
#Loop through all the folders
ProcessAllSubfolders($folders)
function ProcessAllSubfolders($folderCollection) {
foreach ($folder in $folderCollection)
{
if ($folder.Subfolders.Count -gt 0)
{
ProcessAllSubfolders($folder.SubFolders)
}
else
{
Write-Output "`nReady to process files in a folder : $folder.FullName `n "
$files = Get-ChildItem $folder.FullName
ProcessFiles($files)
}
}
}
function ProcessFiles($files) {
foreach ($file in $files)
{
Write-Output "`nReady to process file: $file `n "
}
}
Кредит для метода навигации подпапки принадлежит here
Я ценю любые указатели!
Для начала, 'Get-ChildItem' возвращает 'DirectoryInfo' для папки, и у них нет свойства' .Subfolders' (если только это не было новым в PowerShell 5?), Поэтому счетчик никогда не будет больше 0. Из этого, я думаю, вы тестируете только простейший случай с одним уровнем папки под c: \ temp? Кроме того, поскольку вы вызываете функции перед их определением, я предполагаю, что вы на самом деле запускаете тело функции из * предыдущего * запуска скрипта, где вы ввели '$ folder.Name', а затем скорректировали его? Я не вижу другой отличной возможности. – TessellatingHeckler