找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: 5i365

[问题求助] PowerShell动态移动符合条件的文件夹

[复制链接]
 楼主| 发表于 2022-2-13 09:19:16 | 显示全部楼层
本帖最后由 5i365 于 2022-2-13 09:31 编辑

回复 13# for_flr


    我把根据文件DD移动到OK文件夹的功能去掉了, 只留下了最开始,那个复杂的, 根据文件夹数量移动文件夹的功能,

问题就是, 在不满足移动条件下, 仍会把源文件夹中的yes改名, 应该是先移过去, 然后再改名, 但文件名又是原来的文件夹的父目录名

感觉问题应该出在红色字的地方, 尝试加在后面蓝字的地方也不行, 不知道怎样改粉色地方的代码


#@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
cd Task3

$num = 5

[System.Collections.ArrayList]$src = @()

$dir = dir -filter *. | where{
        (dir $_ -name) -contains "OK" -and (dir $_ -name) -notcontains "NO"
}

$src += $dir | foreach{
        dir $_ -exclude OK |
        where{ (dir $_ -n) -contains "YES" }
}

$des += dir -filter *. | where{
        (dir $_ -name) -contains "OK" -and (dir $_ -name) -contains "NO"
}

$src | foreach{
        if (test-path $_\YES)
        {
                ren $_\YES $_.parent.name
        }
}


$des | foreach{
        for ($i = (dir $_).count; $i -lt $num; $i++)
        {
                if ($src.count -gt 0)
                {
                        move $src[0] $_
                        #ren $_\YES $_.parent.name
                        $src.removeat(0)
                }
        }
}
 楼主| 发表于 2022-2-13 11:02:15 | 显示全部楼层
本帖最后由 5i365 于 2022-2-13 11:09 编辑

回复 2# for_flr


    这个第5行前面是不是应该新建个数组? 这个不太理解, 我看前面 源 是先建了一个数组 [System.Collections.ArrayList]$src = @()
另外, 为什么 要$des+=直接$des=不行吗?
$des = @()
$des+=dir -filter *.|?{(dir $_ -name) -contains "OK" -and (dir $_ -name) -contains "NO"}
 楼主| 发表于 2022-2-13 20:20:12 | 显示全部楼层
回复 5# for_flr


    终于搞定了, 删除上面红字的代码, 然后将最后的代码改为如下, 就可以了!
  1. $des | foreach{
  2.         for ($i = (dir $_).count; $i -lt $num; $i++)
  3.         {
  4.                 if ($src.count -gt 0)
  5.                 {
  6.                         move $src[0] $_
  7.                         $s = $src[0].name
  8.                         $s2 = $src[0].parent.name
  9.                         ren $_\$s\YES -newname $s2
  10.                         $src.removeat(0)
  11.                 }
  12.         }
  13. }
复制代码
 楼主| 发表于 2022-2-13 20:24:19 | 显示全部楼层
本帖最后由 5i365 于 2022-2-13 20:32 编辑

最终代码:

  1. cd Task3; $num = 6; [Collections.ArrayList]$src = @()

  2. $dir = gci -dir | where{
  3.         (dir $_ -name) -contains "OK" -and (dir $_ -name) -notcontains "NO"
  4. }

  5. $src += $dir | foreach{
  6.         dir $_ -exclude OK |
  7.         where{ (dir $_ -name) -contains "YES" }
  8. }

  9. $des = gci -dir | where{
  10.         (dir $_ -name) -contains "OK" -and (dir $_ -name) -contains "NO"
  11. }

  12. $des | foreach{
  13.         for ($i = (dir $_ -dir).count; $i -lt $num; $i++)
  14.         {
  15.                 if ($src.count -gt 0)
  16.                 {
  17.                         move $src[0] $_
  18.                         $s = $src[0].name
  19.                         $s2 = $src[0].parent.name
  20.                         ren $_\$s\YES -newname $s2
  21.                         $src.removeat(0)
  22.                 }
  23.         }
  24. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:43 , Processed in 0.016547 second(s), 6 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表