2016-04-05 10 views
0

Ich möchte die Datei "file_to_move.txt" in jedem Ordner in ihren jeweiligen "done" -Ordner verschieben.Dateien mit Poweshell in eine Ordnerstruktur in ihren jeweiligen Unterordner kopieren

so der file_to_move.txtin C: \ Temp \ test \ folder1 zu C bewegt wird: \ Temp \ test \ folder1 \ done und file_to_move.txtin C: \ Temp \ test \ folder2 wird C bewegt: \ Temp \ test \ folder2 \ done

... und so weiter, vorzugsweise mit einem% date% _% time% auf den Datei-Namen hinzugefügt.

Wenn ein Ordner (wie im folgenden Beispiel Ordner4) keine Datei_zu_move.txt hat, sollte das Skript es einfach ignorieren und weitergehen.

Ordnerstruktur Beispiel:

  • 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 \ Ordner3 \ 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

ich habe mit einem Powershell-Skript experimentiert, auch wenn ich es nicht sehr gut bin, und ich weiß nicht, es in einem getan werden kann, Standard-Batch-Skript. Ich habe schon versucht, diese so weit:

In einer Batch-Skript:

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

im movescript.ps1:

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

Aber das funktioniert nicht. Ich denke, es ist nicht präzise genug, um zu arbeiten.

Als Bonus, kann die ganze Sache innerhalb der grundlegenden Skript durchgeführt werden oder müssen wir die externe .PS1-Datei verwenden?

Antwort

3

Sie können das Cmdlet Get-ChildItem mit einem Filter verwenden, um alle file_to_move.txt Dateien rekursiv aus einem Pfad abzurufen. Verwenden Sie die Foreach-Object (alias foreach), um über sie zu iterieren und den neuen Pfad mit dem Cmdlet Join-Path zu kombinieren. Um den Artikel zu kopieren, können Sie das Copy-Item Cmdlets verwenden:

$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 
} 

Wenn Sie eine Zeitmarke hinzufügen möchten, können Sie das Get-Date Cmdlets verwenden, und rufen Sie die ToString Methode mit Ihrem gewünschten Format auf sie, Beispiel:

(Get-Date).ToString("yyyy-dd-M_HH-mm-ss") 

Ausgang:

2016-05-4_15-06-02 

Sie können nun concat den Dateinamen ein Format-String und den $_.Basename und 012 mitEigenschaft innerhalb Ihrer foreach Schleife. Ich werde das als eine Übung für dich verlassen.

Verwandte Themen