我想将每个文件夹中的文件“file_to_move.txt”移动到各自的“完成”文件夹。
因此 C:\ Temp \ test \ folder1 中的 file_to_move.txt 会移至 C:\ Temp \ test \ folder1 \ done C:\ Temp \ test \ folder2 中的 file_to_move.txt 移至 C:\ Temp \ test \ folder2 \ done
...依此类推,最好将%date%_%time%添加到文件名。
如果文件夹(如下例中的folder4)没有file_to_move.txt,则脚本应该忽略它并继续前进。
文件夹结构示例:
我已经尝试过Powershell脚本,即使我不是很擅长它,我也不知道它可以用标准的批处理脚本完成。 到目前为止我试过这个:
在批处理脚本中:
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%bin\movescript.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%'"
movecript.ps1中的:
Move-Item C:\Temp\test\*\file_to_move.txt C:\Temp\test\*\done\file_to_move_$(get-date -f yyyyMMdd_HHmmss).txt
但这不起作用。 我想这不够精确。
作为奖励,整个事情可以在基本脚本中完成,还是我们必须使用外部.PS1文件?
答案 0 :(得分:3)
您可以将Get-ChildItem cmdlet与过滤器一起使用,以便从路径中递归检索所有file_to_move.txt
个文件。使用Foreach-Object(别名foreach)迭代它们并使用Join-Path cmdlet组合新路径。要复制项目,您可以使用Copy-Item cmdlet:
$itemsToCopy = Get-ChildItem -Path c:\Temp\Test -Filter file_to_move.txt -Recurse
$itemsToCopy | foreach {
$newPath = Join-Path $_.DirectoryName 'done'
New-Item -Path $newPath -ItemType directory -Force | out-null
$_ | Copy-Item -Destination $newPath
}
如果要添加时间戳,可以使用Get-Date cmdlet并使用所需格式调用ToString
方法,例如:
(Get-Date).ToString("yyyy-dd-M_HH-mm-ss")
输出:
2016-05-4_15-06-02
现在,您可以使用格式字符串以及foreach循环中的$_.Basename
和$_.Extension
属性来连接文件名。我会把这作为练习留给你。