Как заставить PowerShell искать файлы в других папках при перемещении элементов?

Я написал этот скрипт для перемещения файлов в папку назначения. Похоже, я что-то упустил, потому что когда я запускаю скрипт, он ищет только файлы .zqx в текущем каталоге, а не на всех дисках. Обратите внимание, что часть ( dir $paths..) быстро возвращает список файлов .zqx.

Paths.txt имеет такие буквы дисков

C:\
D:\
E:\

$paths = get-content paths.txt
mv (dir $paths -r -fi *.zqx | ?{$_.lastwritetime -lt ($sevendaysold)}) -dest e:\xqz

person Animesh    schedule 10.01.2011    source источник


Ответы (1)


Ну, одна проблема, с которой вы столкнетесь, заключается в том, что часть, которая вычисляет пути к файлам для перемещения, создает только имена файлов, а не полные пути. Попробуйте это, чтобы понять, о чем я говорю:

$OFS="`n"
"$(dir $paths -r -fi *.zqx | ?{$_.lastwritetime -lt ($sevendaysold)})"

Параметр Path для Move-Item принимает тип [string[]], поэтому PowerShell преобразует результаты вашего выражения dir в массив строк. К сожалению, объекты System.IO.FileInfo отображают «ToString ()» на основе имени файла, который они создали с помощью IIRC.

К счастью, это легко исправить. Передайте объекты FileInfo в Move-Item следующим образом:

dir $paths -r *.zqx | ?{$_.lastwritetime -lt $sevenDaysOld} | mv -dest e:\xqz
person Keith Hill    schedule 10.01.2011
comment
ИМХО дело в несоответствии. Команды должны давать одинаковые результаты независимо от того, как передаются параметры. Я столкнулся с похожими проблемами с Select-String connect.microsoft.com/PowerShell/feedback/details/576354/ - person stej; 11.01.2011
comment
Кит, исправление сработало отлично, и ваше предыдущее объяснение абсолютно понятно, почему мое утверждение не сработает. Будет более внимательно следить за тем, как работает преобразование при попытке отправить результаты одной команды другой команде. Спасибо! - person Animesh; 11.01.2011
comment
@Stej, да, должен согласиться. Это неприятная часть сложности привязки конвейера в PowerShell, где в данном случае привязка выполняется по имени свойства. Если бы он связал by value, то им пришлось бы выяснить, как исправить FileInfo. Или, возможно, bind by property name было исправлением. :-) - person Keith Hill; 11.01.2011