Board logo

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

作者: 5i365    时间: 2022-2-13 08:24     标题: 如何使用ps交换文件夹名中的两个字段的位置

本帖最后由 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
作者: for_flr    时间: 2022-2-14 10:30

不会正则,用字符串的.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]
复制代码

作者: 5i365    时间: 2022-2-14 13:40

回复 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
作者: 5i365    时间: 2022-2-14 13:48

回复 2# for_flr


    更改文件夹的名字, 也有个有趣的事儿, 我反复的执行代码, 前面的空格会越来越多

作者: for_flr    时间: 2022-2-14 17:54

本帖最后由 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{$_}
复制代码

作者: 5i365    时间: 2022-2-14 18:19

回复 5# for_flr

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

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

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

$name = $_.name.split("-", 2, [System.StringSplitOptions]::RemoveEmptyEntries)
作者: 5i365    时间: 2022-2-19 16:21

本帖最后由 5i365 于 2022-2-19 16:23 编辑

回复 5# for_flr


    正则替换就是类似下面这种
"Hello Anders" -Replace '(.*) (.*)','$2 $1'
结果:Anders Hello
作者: 5i365    时间: 2022-2-19 16:24

回复 5# for_flr


    解决了,  这种方法感觉稳多了
"Where-Object -> where" -Replace '(.*) -> (.*)', '$2 -> $1'




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2