2

我有一个名为“Ben_sucksatpowershell_2018_07_13_21_22_07.txt”的文件名,我正在尝试将该文件重命名为“b.20180713.b”

对于我正在编写的脚本,我需要重命名一系列这些文件,并且新名称需要基于原始文件名中的原始 yyyy_MM_dd

我知道我可以替换文件名的一部分,但我不知道如何去除下划线,或执行多重替换,或在同一命令中重命名文件名。我对powershell还是新手。我一直找不到我要找的东西。我将不胜感激有关如何获得我想要的东西的指导。

Foreach ($Slave in $Slaves)
{
$ProcessedPath = "\\$Server\Directory\Processed\"
$ProcessedSlave = "$ProcessedPath\$Slave\"
    If (!(Test-Path $ProcessedSlave))
    {
        Copy-Item -Path $Eticket -Destination $ProcessedPath -Force
        ren $Eticket  -NewName {$_.Name -replace ("Ben_sucksatpowershel_", "b.") | (".txt",".b")} #of course, this doesn't work though.

    }
    Else 
    {
         Write-Host "Potato"
    }
4

2 回答 2

2

假设你有一个文件名的集合,在数组下面的例子中$filenames,你可以使用一个简单的正则表达式来匹配原来的 yyyy_MM_dd,然后替换下划线:

foreach ($filename in $filenames) {
    if ($filename -match '.*_(\d{4}_\d{2}_\d{2})_.*') {
        # $matches is a special / built-in PowerShell variable:
        # 1. $matches[0] => full regex match
        # 2. $matches[1] => first capturing group
        # 3. $matches[n] => nth capturing group
        $newName = "b.$($matches[1].Replace('_', '')).b";
        # remove -WhatIf when you're ready
        ren $filename  -NewName $newName -WhatIf;
    } else {
        Write-Warning "[$filename] does not match expected pattern"
    }
}
于 2018-07-23T22:01:18.630 回答
2

只关注单个-replace操作如何实现所需的转换:

$n = 'Ben_sucksatpowershell_2018_07_13_21_22_07.txt'
$n -replace '^Ben_sucksatpowershell_(\d{4})_(\d{2})_(\d{2})_.*?\.txt$', 'b.$1$2$3.b'

以上产生:

b.20180713.b
  • 请注意正则表达式是如何设计为匹配整个输入 ( ^...$),以便替换表达式完全替换它

  • 捕获组 ( (...)) 用于提取感兴趣的子字符串,这些子字符串在替换表达式中按顺序引用($1对于第一个捕获组,$2对于第二个,...);\d代表一个数字,并且{<n>}完全代表<n>重复)。

  • 为简洁起见,文件扩展名 ( _.*?) 之前的输入中剩余的标记没有明确匹配,但您可以轻松添加它。

假设您的其余代码按预期工作,请按如下方式修改您的ren( Rename-Item) 调用:

Rename-Item $Eticket -NewName {
  $_.Name -replace '^Ben_sucksatpowershell_(\d{4})_(\d{2})_(\d{2})_.*?\.txt$', 'b.$1$2$3.b'
}
于 2018-07-24T00:38:47.510 回答