簡體   English   中英

使用Powershell將文件夾結構中的文件復制到其各自的子文件夾

[英]Copy files in a folder structure to their respective sub-folder with Powershell

我想將每個文件夾中的文件“ file_to_move.txt”移動到它們各自的“完成”文件夾中。

所以file_to_move.txtC:\\ TEMP \\測試\\ folder1中移動到C:\\ TEMP \\測試\\ folder1中\\完成 ,用C file_to_move.txt:\\ TEMP \\測試\\文件夾2移動到C:\\ TEMP \\測試\\ folder2 \\ done

...依此類推,最好在文件名中添加%date%_%time%。

如果文件夾(如下面的示例中的folder4)沒有file_to_move.txt,則腳本應忽略它並繼續前進。

文件夾結構示例:

  • C:\\ Temp \\ test \\ DONE
  • C:\\ Temp \\ test \\ folder1
  • C:\\ Temp \\ test \\ folder1 \\ done
  • C:\\ Temp \\ test \\ folder1 \\ some_other_folder
  • C:\\ Temp \\ test \\ folder1 \\ some_other_file.txt
  • C:\\ Temp \\ test \\ folder1 \\ file_to_move.txt
  • C:\\ Temp \\ test \\ folder2
  • C:\\ Temp \\ test \\ folder2 \\ done
  • C:\\ Temp \\ test \\ folder2 \\ some_other_folder
  • C:\\ Temp \\ test \\ folder2 \\ some_other_file.txt
  • C:\\ Temp \\ test \\ folder2 \\ file_to_move.txt
  • C:\\ Temp \\ test \\ folder3
  • C:\\ Temp \\ test \\ folder3 \\ done
  • C:\\ Temp \\ test \\ folder3 \\ some_other_folder
  • C:\\ Temp \\ test \\ folder3 \\ some_other_file.txt
  • C:\\ Temp \\ test \\ folder3 \\ file_to_move.txt
  • C:\\ Temp \\ test \\ folder4
  • C:\\ Temp \\ test \\ folder4 \\ done
  • C:\\ Temp \\ test \\ folder4 \\ some_other_folder
  • C:\\ Temp \\ test \\ folder4 \\ some_other_file.txt

即使我不太擅長於Powershell腳本,我也進行了試驗,但我不知道它可以用標准的批處理腳本來完成。 到目前為止,我已經嘗試過了:

在批處理腳本中:

SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%bin\movescript.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%'"

在movescript.ps1中:

Move-Item C:\Temp\test\*\file_to_move.txt C:\Temp\test\*\done\file_to_move_$(get-date -f yyyyMMdd_HHmmss).txt

但這是行不通的。 我猜這還不夠精確。

另外,可以在基本腳本內完成全部操作,還是必須使用外部.PS1-文件?

您可以將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 $_.Basename屬性來連接文件名。 我將把它作為練習留給您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM