使用Powershell

时间:2016-04-05 12:40:07

标签: powershell batch-file move

我想将每个文件夹中的文件“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,则脚本应该忽略它并继续前进。

文件夹结构示例:

  • C:\ TEMP \测试\ DONE
  • C:\ TEMP \测试\文件夹1
  • C:\ TEMP \测试\ folder1中\完成
  • C:\ TEMP \测试\ folder1中\ some_other_folder
  • C:\ TEMP \测试\ folder1中\ some_other_file.txt
  • C:\ TEMP \测试\ folder1中\ file_to_move.txt
  • C:\ TEMP \测试\文件夹2
  • C:\ TEMP \测试\文件夹2 \完成
  • C:\ TEMP \测试\文件夹2 \ some_other_folder
  • C:\ TEMP \测试\文件夹2 \ some_other_file.txt
  • C:\ TEMP \测试\文件夹2 \ file_to_move.txt
  • C:\ TEMP \测试\ folder3
  • C:\ TEMP \测试\ folder3 \完成
  • C:\ TEMP \测试\ folder3 \ some_other_folder
  • C:\ TEMP \测试\ folder3 \ some_other_file.txt
  • C:\ TEMP \测试\ folder3 \ file_to_move.txt
  • C:\ TEMP \测试\ folder4
  • C:\ TEMP \测试\ folder4 \完成
  • C:\ TEMP \测试\ folder4 \ some_other_folder
  • C:\ TEMP \测试\ folder4 \ some_other_file.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文件?

1 个答案:

答案 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属性来连接文件名。我会把这作为练习留给你。