Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Get-ChildItem и обратный слэш в пути (http://forum.oszone.net/showthread.php?t=340633)

Knaps 22-05-2019 10:03 2872644

Get-ChildItem и обратный слэш в пути
 
Добрый день. Подскажите, пожалуйста, что нужно почитать, чтобы понять причину странного поведения 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 2872659

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

Knaps 22-05-2019 12:32 2872664

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

YuS_2 22-05-2019 14:44 2872695

Цитата:

Цитата Knaps
А что за новый принцип определения местоположения? »

Если почитать справку, там это есть. Но написано не слишком дружественно пользователю.
Если в картинках, то будет нагляднее:
Наглядная разница определения местоположения Get-ChildItem с рекурсией powershell v 5.1 и v 2.0

Всё содержимое каталога d:\test


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

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

Knaps 22-05-2019 22:35 2872741

Спасибо, теперь понял, что имели в виду.


Время: 00:33.

Время: 00:33.
© OSzone.net 2001-