假设我们有以下目录结构:
~dir00
|-> dir10
| |-> dir20
| |-> file1.txt
|-> dir11
|-> file2.txt
现在,假设~dir00是当前目录。我原本期望两个命令
get-childitem * -recurse
和get-childitem -recurse
产生相同的结果。但是,他们没有。第二种行为就是我所期待的。
我正在尝试编写一个小工具库,用于我们的脚本化进程。我需要编写的一个工具是复制和备份文件集的工具。作为输入,我得到的东西告诉我什么文件/目录/等。复印。我无法知道用户可能提供的内容。它们可以提供诸如“*”的通配符,它们可以提供文件名,它们可以提供-recurse参数等。输入被馈送到get-childitem。当“路径”只是“*”时,get-childitem行为的不一致是一个大问题。为什么get-childitem在输入-path和-recurse选项时会突然丢弃第一级目录? (请注意,它只删除了第一级目录。)有什么方法可以防止这种奇怪的行为吗?
现在,它变得更加古怪。如果我们将文件放在根目录中,那么文件结构将变为
~dir00
|-> dir10
| |-> dir20
| |-> file1.txt
|-> dir11
| |-> file2.txt
|-> file3.txt
然后突然不删除目录。要重现这一点,只需执行以下脚本:
cd $Env:temp
mkdir dir00\dir10\dir20 | out-null
cd dir00
mkdir dir11 | out-null
echo 'hello world 1'>dir10\dir20\file1.txt
echo 'hello world 2'>dir11\file2.txt
$list1 = get-childitem -recurse
echo 'Results of get-childitem -recurse: '
$list1
echo ''
echo 'Number of items:'
$list1.length
echo ''
$list2 = get-childitem * -recurse
echo 'Results of get-childitem * -recurse: '
$list2
echo ''
echo 'Number of items:'
$list2.length
echo ''
echo "hello world 3">file3.txt
$list3 = get-childitem * -recurse
echo 'Results of get-childitem * -recurse: '
$list3
echo ''
echo 'Number of items:'
$list3.length
echo ''
答案 0 :(得分:7)
这是因为您输入Get-ChildItem的路径不同。
执行时:
Get-ChildItem -Recurse
你说的是:
Get-ChildItem -Path . -Recurse
或解释为:Get Child Item -Path从当前目录(dir00)开始
执行时:
Get-ChildItem * -Recurse
您说,使用*,遍历目录中的所有项目,将这些路径提供给Get-ChildItme,然后通过这些项目进行递归。所以执行的等效命令是:
$items = Get-ChildItem *
Get-ChildItem $items -Recurse
其中包括:
Get-ChildItem -Path ./dir10 -Recurse
Get-ChildItem -Path ./dir11 -Recurse
现在,您所看到的是这种行为的奇怪异常(或可能被视为错误),并且只有在您拥有仅包含文件夹且没有文件的根目录时才会发生这种情况。如果在dir00中创建一个文件:
echo 'hello world 1'>test1.txt
然后我们执行
Get-ChildItem * -Recurse
它与Get-ChildItem -Recurse
完全相同。因此,只有当您的根目录没有文件,只有文件夹时,才会得到不同的结果。
答案 1 :(得分:1)
此异常行为的一种可能解决方法是将星号替换为句点,从而指示Get-ChildItem CMDLet与当前目录一起使用。像这样:
$suppliedPath = "*"
if($suppliedPath -eq "*"){
$suppliedPath = $suppliedPath.replace("*", ".")
}
Get-ChildItem $suppliedPath -recurse