PDA

Показать полную графическую версию : Get-ChildItem и обратный слэш в пути


Knaps
22-05-2019, 10:03
Добрый день. Подскажите, пожалуйста, что нужно почитать, чтобы понять причину странного поведения Get-ChildItem?

Сам код:
Get-ChildItem
mkdir Test1\Test2\Test3
Get-ChildItem -Recurse '.\Test1'
Get-ChildItem -Recurse '.\Test2'
Get-ChildItem -Recurse '.\Test3'
Get-ChildItem -Recurse '.\Test1\'
Get-ChildItem -Recurse '.\Test2\'
Get-ChildItem -Recurse '.\Test3\'
mkdir T\Test2\Test3
Get-ChildItem -Recurse '.\Test1\'
Get-ChildItem -Recurse '.\Test2\'
Get-ChildItem -Recurse '.\Test3\'
Get-ChildItem -Recurse '.\Test1\\'
Get-ChildItem -Recurse '.\Test2\\'
Get-ChildItem -Recurse '.\Test3\\'
mkdir Te\Test2\Test3
Get-ChildItem -Recurse '.\Test1\\'
Get-ChildItem -Recurse '.\Test2\\'
Get-ChildItem -Recurse '.\Test3\\'

Вывод:
PS T:\> Get-ChildItem
PS T:\> mkdir Test1\Test2\Test3


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test1'


Directory: T:\Test1


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test2'


Directory: T:\Test1


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


PS T:\> Get-ChildItem -Recurse '.\Test3'


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test1\'


Directory: T:\Test1


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test2\'
Get-ChildItem : Cannot find path 'T:\T' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Recurse '.\Test2\'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:\T:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS T:\> Get-ChildItem -Recurse '.\Test3\'
Get-ChildItem : Cannot find path 'T:\T' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Recurse '.\Test3\'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:\T:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS T:\> mkdir T\Test2\Test3


Directory: T:\T\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test1\'


Directory: T:\Test1


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test2\'


Directory: T:\T


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


PS T:\> Get-ChildItem -Recurse '.\Test3\'


Directory: T:\T\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test1\\'


Directory: T:\Test1


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test2\\'
Get-ChildItem : Cannot find path 'T:\Te' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Recurse '.\Test2\\'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:\Te:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS T:\> Get-ChildItem -Recurse '.\Test3\\'
Get-ChildItem : Cannot find path 'T:\Te' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Recurse '.\Test3\\'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:\Te:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS T:\> mkdir Te\Test2\Test3


Directory: T:\Te\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test1\\'


Directory: T:\Test1


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


Directory: T:\Test1\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\> Get-ChildItem -Recurse '.\Test2\\'


Directory: T:\Te


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test2


PS T:\> Get-ChildItem -Recurse '.\Test3\\'


Directory: T:\Te\Test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 22.05.2019 9:55 Test3


PS T:\>

YuS_2
22-05-2019, 12:05
А чего тут читать... баг, он и в Индии баг. Программистам надо руки выправлять, которые этот командлет в таком виде выпустили. В PoSh Core этот баг тоже присутствует. В powershell v 2.0 его не было, а как ввели новый принцип определения местоположения, с версии 3.0, так этот баг и поселился

Knaps
22-05-2019, 12:32
О, я думал, это все-таки странная фича. Спасибо! А что за новый принцип определения местоположения?

YuS_2
22-05-2019, 14:44
А что за новый принцип определения местоположения? »
Если почитать справку, там это есть. Но написано не слишком дружественно пользователю.
Если в картинках, то будет нагляднее:
https://jpegshare.net/images/d2/d4/d2d42ccadb71a9a68ff378b346c5bbee.png (https://jpegshare.net/)
https://jpegshare.net/images/f2/b8/f2b82bf1c1125f1b9429e5d720f8158d.png (https://jpegshare.net/)

Т.е. если командлету указать в качестве пути файл и включить рекурсию, он будет искать этот файл не только в текущем каталоге, но и во всех каталогах, находящихся в текущем каталоге, т.е. рядом с указанным путем к файлу. Если путь абсолютный, то в качестве текущего будет принят родительский каталог указанного файла:
D:\TEST\test1.ext - здесь, это каталог TEST
и все каталоги, находящиеся в нем будут просмотрены рекурсивно.
- так работает командлет начиная с версии powershell 3.0

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

Knaps
22-05-2019, 22:35
Спасибо, теперь понял, что имели в виду.




© OSzone.net 2001-2012