我在PowerShell中制作重命名脚本时遇到了一些麻烦.情况:在一个目录中我有以下列格式命名的文件夹:"四位数 - 文本 - 垃圾"我要将其重命名为"text(四位数)"
现在我已经创建了一个目录,其中包含一些样本名称:
1996年 - 一些有趣的东西 - 一些糟糕的东西
2006年 - 复制此 - 忽略
我已经尝试设置一个脚本来回显他们的名字,但我不能完全掌握正则表达式.以下代码只打印"1996 - something"和"2006 - copy"
Get-ChildItem | Foreach-Object { if ($_.BaseName -match "(\d{4} - \w+ -*)") { echo $matches[0]}}
Run Code Online (Sandbox Code Playgroud)
这个将打印"1996 - 有趣的东西 - 一些糟糕的东西\n()"和"2006 - 复制这个 - 忽略\n()"
Get-ChildItem | Foreach-Object { echo ($_.BaseName -replace "(\d{4} - \w+ - *)"), "$2 ($1)"}
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么这两种方法都不尊重文字字符串" - "作为匹配的边界吗?
*编辑*感谢zespri,解决我的问题的代码是
Get-ChildItem | Foreach-Object {
if ($_.BaseName -match "(\d{4} - [^-]*)") { 
  Rename-Item $_ ($_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)')
  }
}
Run Code Online (Sandbox Code Playgroud)
    这对你有用吗:
Get-ChildItem | Foreach-Object { 
  if ($_.BaseName -match "(\d{4} - [^-]*)") { 
      echo $matches[0].TrimEnd()
    }
}
Run Code Online (Sandbox Code Playgroud)
注意TrimEnd - 这是在第二个破折号之前修剪尾随空格.
至于为什么你的例子不起作用:\ w +匹配任何单词字符,因此它与"有趣的东西"里面的空格不匹配.*表示零或更多.所以 - *匹配零个或多个破折号,在你的情况下 - 零.
编写可能适合您的表达式的另一种方法是:
Get-ChildItem | Foreach-Object { 
  if ($_.BaseName -match "(\d{4} - .+(?= -))") { 
      echo $matches[0]
    }
}
Run Code Online (Sandbox Code Playgroud)
其中(?= -)构造是正向前瞻断言 
在这种情况下,您不需要修剪末尾的额外空间,因为它在正则表达式中占用.
更新1
修改后进行转换:
gci | %{ $_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)' }
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           11295 次  |  
        
|   最近记录:  |