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

[问题求助] 如何使用ps交换文件夹名中的两个字段的位置

[复制链接]
发表于 2022-2-13 08:24:02 | 显示全部楼层 |阅读模式
本帖最后由 5i365 于 2022-2-13 08:33 编辑

当前文件夹下的子文件夹的名字都是类似下面这样, 是用 - 做的分隔符,把它定义为一个变量$fgf 现在我想交换前后两个字段的位置
以前有印象, 在某些PS代码中, 好象用正则中的$1 $2可以代码前后两个字段, 但是一时找不到代码了, 求高手支招, 非常感谢!

中 - A
国 - B-大
日 - C
本 - D-小

-------------------------交换后:

A - 中
B-大 - 国
C - 日
D-小 - 本

---------------------------------
上面的功能如能实现: 应该也可以交换下面的这种情况

? -> Where-Object
where -> Where-Object
% -> ForEach-Object
foreach -> ForEach-Object
发表于 2022-2-14 10:30:34 | 显示全部楼层
不会正则,用字符串的.split()方法
中 - A
国 - B-大
日 - C
本 - D-小
  1. dir -dir|ren -newname{
  2. $name=$_.name.split("-",2)
  3. $name[1]+" - "+$name[0]
  4. }
复制代码
  1. $s="? -> Where-Object"
  2. $s.split("->",3)[2]+" -> "+$s.split("->",3)[0]
复制代码
 楼主| 发表于 2022-2-14 13:40:22 | 显示全部楼层
回复 2# for_flr


    感谢大侠帮忙,
在遍历文件修改时, 空行也会加上 ->
  1. cd $HOME\Desktop
  2. gc -enc UTF8 "PS别名.txt" | foreach{
  3.         $_.split("->", 3)[2] + " -> " + $_.split("->", 3)[0]
  4. } | Out-File -enc utf8 别名ok.txt
复制代码
原txt:
? -> Where-Object
where -> Where-Object
% -> ForEach-Object
foreach -> ForEach-Object

type -> Get-Content

转后的txt:
Where-Object -> ?
Where-Object -> where
ForEach-Object -> %
ForEach-Object -> foreach
->
Get-Content -> type
 楼主| 发表于 2022-2-14 13:48:08 | 显示全部楼层
回复 2# for_flr


    更改文件夹的名字, 也有个有趣的事儿, 我反复的执行代码, 前面的空格会越来越多
发表于 2022-2-14 17:54:04 | 显示全部楼层
本帖最后由 for_flr 于 2022-2-15 09:08 编辑

空行问题加个if $_ -ne ""
split()产生空格问题,用[StringSplitOptions]::RemoveEmptyEntries
可以搜一下。

回复 6# 5i365
  1. dir -dir|%{$n=$_.name.split(" -",2,[stringsplitoptions]::removeemptyentries);$n[0]+"-"+$n[1]}
复制代码
  1. dir -dir|%{$n=$_.name.split(" -",4);$n[0]+"-"+$n[3]}
复制代码
这两个结果是一样的,都不会有额外空格,反复更名会出意外是因为更名后原来的代码已经不适用于新的数据规律。
保留空行:
  1. if $_.tirm() -ne ""{xxx}else{$_}
复制代码
 楼主| 发表于 2022-2-14 18:19:15 | 显示全部楼层
回复 5# for_flr

这样就没有空行了, 怎样保留空行?

            if ($_.trim() -ne "")
        {
                $_.split("->", 3)[2] + " -> " + $_.split("->", 3)[0]
        }

-------------------------------------------------------------------------
加上了参数, 还是会加空格

$name = $_.name.split("-", 2, [System.StringSplitOptions]::RemoveEmptyEntries)
 楼主| 发表于 2022-2-19 16:21:56 | 显示全部楼层
本帖最后由 5i365 于 2022-2-19 16:23 编辑

回复 5# for_flr


    正则替换就是类似下面这种
"Hello Anders" -Replace '(.*) (.*)','$2 $1'
结果:Anders Hello
 楼主| 发表于 2022-2-19 16:24:29 | 显示全部楼层
回复 5# for_flr


    解决了,  这种方法感觉稳多了
"Where-Object -> where" -Replace '(.*) -> (.*)', '$2 -> $1'
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 01:37 , Processed in 0.020286 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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