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

[问题求助] 如何使用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

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

TOP

回复 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

TOP

回复 2# for_flr


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

TOP

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

TOP

回复 5# for_flr

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

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

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

$name = $_.name.split("-", 2, [System.StringSplitOptions]::RemoveEmptyEntries)

TOP

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

回复 5# for_flr


    正则替换就是类似下面这种
"Hello Anders" -Replace '(.*) (.*)','$2 $1'
结果:Anders Hello

TOP

回复 5# for_flr


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

TOP

返回列表