PowerShell Get-ChildItem с переменной и строкой - PullRequest
0 голосов
/ 05 ноября 2018

Вернемся к этому снова, пытаясь удалить файлы с помощью PowerShell.

Сейчас я пытаюсь удалить файлы, которые начинаются с «Export_», а затем двухзначного года, за которым следует юлианская дата. Например, сегодня будет Export_18309. Есть дополнительные цифры после 18309 года, но они не актуальны. В моем текущем коде «Export_» - это строка, а моя дата была преобразована в Int, чтобы я мог делать математические вычисления и увеличивать ее.

Я установил $dval на 18302 в качестве контрольного примера для файлов, с которыми я работал. Я знаю, что в настоящее время ничего не удаляется, так как я вывожу текстовый файл для ручной проверки, прежде чем продолжить. Однако, если вывод текстового файла неверен, попытка удаления не имеет смысла.

Моя проблема в настоящее время находится в блоке кода function WriteArch. Я пытаюсь объединить строку и int, чтобы PowerShell отображал результаты, которые начинаются только с «Export_» и $dval как Export_ $ dval. Я сделал эту конкретную строку кода так, чтобы лучше изобразить то, что я пытаюсь.

Редактировать: цикл for в WriteArch должен увеличиваться с 18302 до 18303, затем до 18304 и т. Д., Поскольку я удаляю файлы за неделю до запуска сценария.

$path0 = 'U:\PShell\Testing\IBM3 Cleanup\logfiles'
$archLog = 'U:\PShell\Testing\IBM3 Cleanup\LogArchive.txt'

$day = (Get-Date).DayOfWeek
$date = (Get-Date).ToString("yy") + ((Get- 
Date).DayOfYear).ToString("D3") 
$dval = $date -as [Int]

$dval = Switch ($day) {
"Monday" { ($dval - 7); break }
"Tuesday" { ($dval - 8); break }
"Wednesday" { ($dval - 9); break }
"Thursday" { ($dval - 10); break }
"Friday" { ($dval - 11) }
}

Clear-Content $archLog

$dval = 18302

function WriteArch {
    param( $dval, $path0)
        for ($i = 0; $i -le 4; $i++) {
            Get-ChildItem -Path $path0|
            Where { $_.FullName -Match "Export_" + "$dval"}|
            Add-Content $archLog
            $dval++ 
        }
}

WriteArch $dval $path0

Invoke-Item $archLog

1 Ответ

0 голосов
/ 05 ноября 2018

Оператор Match поддерживает регулярные выражения. Я думаю, что это немного излишне для сценария, который вы описываете - я предлагаю использовать Like. * имеет важное значение, так как сообщает PowerShell, что после имени, указанного вами, есть еще что-то.

Fullname содержит полный путь, включая родительские каталоги и т. Д. - похоже, что вы хотите основать совпадение на BaseName, то есть имени файла, исключая расширение.

Where { $_.BaseName -like "Export_$dval*"}

Помещение переменной $dval в кавычки заставляет PowerShell неявно преобразовывать int в string.

Сравнительная документация операторов , хороший справочник.

...