Powershell 递归复制并更改文件的名称

Powershell 递归复制并更改文件的名称

我正在编写一个脚本,以递归方式在 Windows Powershell(版本:5.1)中创建许多文件的副本,其规范如下:

  • 要复制的文件必须包含他的名字"*1.dat"(星号是文件名的其余部分)
  • 新文件必须复制到原始文件的同一文件夹中
  • 新文件将文件名中的字符串替换"*1.dat""*0.dat"

我设法创建了一个first_script.ps1

$directories = dir -Recurse -Directory

$directories | ForEach-Object {
 & ".\second_script.ps1" $_.FullName
}

该脚本递归传递发现的所有目录和子目录。

second_script.ps1

$path = $_.FullName  //This assign the value passed to '$path'
New-Item -ItemType Directory -Path "$path\temp"  //Create a new temporary folder
Copy-Item * -Include *1.dat -Destination "$path\temp\"  //Copy all the items filtered in the temp folder
rename-item $path\temp\* -NewName {$_.name -replace "1.dat", "0.dat") //Should replace 1.dat with 0.dat
Copy-Item $path\temp\* -Include *0.dat //Copy renamed items to the primary folder
Remove-Item -Path "$path\temp" -Force -Recurse //Remove temp folder

但是:$_.name管道不起作用,可能是因为我已经用传递了文件夹路径$_

如何解决?或者,有更简单的方法吗?我也可以使用 Windows 批处理。

答案1

永远不要再回到批次!

初步测试表明这应该是您所需要的。您可以安全地运行它,因为该-WhatIf参数阻止了实际执行。删除-WhatIfif 结果看起来不错。

gci *1.dat -Recurse |
   Copy-Item -Destination { $_.FullName -replace '1\.dat$', '0.dat'  } -WhatIf

答案2

观察:我也可以使用 Windows 批处理。

为了记录,bat/cmd可以这样做:

  • 在命令行中,如果是当前文件夹:
@for /f tokens^=* %i in ('where /r . *1.dat')do @cmd /v/c "set "_name=%~ni" && echo\copy "%~i" "%~dpi!_name:~0,-1!0%~xi""
  • 或者,如果不是当前文件夹:
@for /f tokens^=* %i in ('where /r "D:\folder" *1.dat')do @cmd /v/c "set "_name=%~ni" && copy "%~i" "%~dpi!_name:~0,-1!0%~xi""
  • 在 bat/cmd 文件中:
@echo off 

for /f tokens^=* %%i in ('where /r . *1.dat
')do cmd /v/c "set "_name=%%~ni" && copy "%%~i" "%%~dpi!_name:~0,-1!0%%~xi""

  1. 使用for /f循环递归获取命令的输出命令where /r,已经仅选择以结尾的文件1.dat

  2. 保存_name当前文件存储在循环变量中%%~ni并使用它来删除带有子字符串的最后一个字符!_Name:~0,-1!

  3. 使用copy以下语法的命令:

Source: %%~i // where provides the full path to output
Target: %%~dpi!_name:~0,-1!0%%~xi"
  • 在哪里:
       %%~dpi == drive: + \all\path\folder
!_name:~0,-1! == name_file_1 = name_file_ // without extension
            0 == add 0 to replace 1 removed by !_name:~0,-1!  
        %%~xi == original extension of your file
  • 对于文件/路径,"D:\Q1561229\sub 1\sub 2\file_1.dat"您的命令如下所示:
Source: "D:\Q1561229\sub 1\sub 2\file_1.dat"
Target: "D:\Q1561229\sub 1\sub 2\file_0.dat"
  • 目标是:
[D:\Q1561229\sub 1\sub 2] + [file_] + [0] + [.dat]
  • 您的命令语法结果:
copy "D:\Q1561229\sub 1\sub 2\file_1.dat" "D:\Q1561229\sub 1\sub 2\file_0.dat"

相关内容