当前位置: 首页 > 知识库问答 >
问题:

“get childitem*-recurse”删除一级目录

酆奇文
2023-03-14

假设我们有以下目录结构:

~dir00
   |-> dir10
   |     |-> dir20
   |           |-> file1.txt
   |-> dir11
         |-> file2.txt

现在,假设~ dir00是当前目录。我本以为这两个命令会产生相同的结果。然而,事实并非如此。第二个人的行为是我所期望的。

我正在尝试编写一个小的工具库,用于我们的脚本化流程。我需要编写的一个工具是复制和备份文件集的工具。作为输入,我得到一些信息,告诉我要复制哪些文件/目录等。我无法知道用户可能会提供什么。它们可能会提供通配符,如“*”,它们可能会提供文件名,它们可能会提供-recurse参数,等等。输入被馈送以获取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 ''

共有2个答案

杨良才
2023-03-14

这种异常行为的一种可能的解决方法是将星号替换为句点,从而指示Get-ChildItem CMDLet使用当前目录。类似于这样:

$suppliedPath = "*"
if($suppliedPath -eq "*"){
    $suppliedPath = $suppliedPath.replace("*", ".")
}
Get-ChildItem $suppliedPath -recurse
隆兴修
2023-03-14

这是因为您输入Get-ChildItem的路径不同。

执行时:

Get-ChildItem -Recurse

您的意思与:

Get-ChildItem -Path . -Recurse

或解释为:获取子项-路径从当前目录(dir00)开始

执行时:

Get-ChildItem * -Recurse

您的意思是,使用*,遍历目录中的所有项,将这些路径馈送到ChildItme,然后递归遍历这些项。因此,执行的等效命令如下:

$items = Get-ChildItem *
Get-ChildItem $items -Recurse

其结果是:

Get-ChildItem -Path ./dir10 -Recurse
Get-ChildItem -Path ./dir11 -Recurse

现在,您看到的是这种行为的一个奇怪的异常(或可能被视为一个bug),只有当您的根目录只包含文件夹而没有文件时,才会发生这种情况。如果在dir00中创建一个文件:

echo 'hello world 1'>test1.txt

然后我们执行

Get-ChildItem * -Recurse

它的列表与Get ChildItem-Recurse的列表完全相同。因此,只有当您的根目录没有文件,只有文件夹时,才会得到不同的结果。

 类似资料:
  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 这是我的xml文件。 我想删除名称为“ ”的节点。如何从xml中删除该特定节点。 我写的代码如下。 问题答案: 我得到了答案。 实际上,我是从xml文件中删除该节点,但没有将其写入xml文件中。 我缺少以下部分 经过长时间的代码研究,我发现了这个愚蠢的错误,因此我纠正了它。 无论如何,谢谢您的回复。

  • 概要 <#visit node using namespace> 或 <#visit node> <#recurse node using namespace> 或 <#recurse node> 或 <#recurse using namespace> 或 <#recurse> <#fallback> 这里: node: 算作 结点变量 的表达式。 namespace: 命名空间,或者是命名空间

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 级联删除通常被用作数据库术语,用来描述删除一个数据行时自动删除关联的数据行的特征。EF Core 实现了一些不同的删除行为,并且允许对关联关系的删除行为进行配置。EF Core 还实现了相关的惯例,它会基于关系的必要性为每个关系配置有用的默认删除行为。 删除行为 删除行为是在 DeleteBehavior 枚举中定义的,可以将它传递给 OnDelete 流式 API 来控制主实体/父实体的删除是否