我正在编写一个脚本,以递归方式在 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
参数阻止了实际执行。删除-WhatIf
if 结果看起来不错。
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""
使用
for /f
循环递归获取命令的输出命令where /r
,已经仅选择以结尾的文件1.dat
保存
_name
当前文件存储在循环变量中%%~ni
并使用它来删除带有子字符串的最后一个字符!_Name:~0,-1!
使用
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"