Powershell - 如果存在于其他目录中则删除文件夹

Powershell - delete folder if exists in an other directory

我在“目录 1”中有文件夹,在“目录 2”中有这些文件夹的压缩包,压缩包名称末尾有“_OK”字样。

目录 1 : 1B002955_SML 23_LEAP 1A 版本 2 mars2022_2022-03-11T08h00m40s_s603575

Directory2 : 1B002955_SML 23_LEAP 1A version2 mars2022_2022-03-11T08h00m40s_s603575_OK

现在我想删除第一个目录中的文件夹,如果第二个目录中存在相应的 zip。这两个目录不在同一台服务器上。

我考虑通过删除“_OK”来重命名 Directory2 zip

rename-item $_ $_.Name.Replace("_OK", "")

然后将 Directory1 和 Directory2 与 compare-object cmdlet 进行比较,但我发现它用于比较指定的属性,在我的例子中,我只想比较名称

Powershell 还是新手,我不确定继续的最佳方法

希望有人能帮忙

谢谢

按如下方式使用 Compare-Object cmdlet,假设:

作为 Get-ChildItem 调用的输出:

Compare-Object -IncludeEqual -PassThru $filesA $filesB -Property { 
    $_.BaseName -replace '_OK$'
  } | Where-Object SideIndicator -eq == | 
        Remove-Item -Recurse -Force -WhatIf

注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf

  • -IncludeEqual 使 Compare-Object 也包括比较相同的对象(默认情况下,仅报告 不同的 个对象)。

  • -PassThru 导致输出一对匹配对象中的 LHS 输入对象(默认情况下,只有匹配的 属性 值 - 由 -Property 参数定义 - 输出。)

  • -Property { $_.BaseName -replace '_OK$' } 使用无名的 calculated property to compare pairs of input objects by; in this case, the -replace 运算符用于有效地删除字符串 _OK,如果出现在末尾 ($),从基本文件名(不带扩展名的文件名)。

  • Where-Object SideIndicator -eq == limits the output to objects that compare equal, using simplified syntax.

  • -Recurse添加到Remove-Item确保目标目录为non-empty时不显示确认提示; -Force 确保删除成功,即使目标目录是隐藏的或包含隐藏的项目。