1

https://stackoverflow.com/questions/ask/adviceを読みましたか? Powershell Move-Item Rename If File Exists http://social.technet.microsoft.com/Forums/scriptcenter/en-US/c347ce7a-3e23-4476-90c2-37b79785ac2f/moving-files-based-on-modified-date Powershell : ファイルを再帰的に移動する http://blogs.technet.com/b/heyscriptingguy/archive/2009/09/22/hey-scripting-guy-september-22-2009.aspxおよびその他約 20 の記事。

申し訳ありませんが、スクリプトとそれが提供する可能性を学ぶのは好きですが、スクリプトの知識はほとんどありません。私の前職では、Windows CMD を使用したバッチ ファイル以外のスクリプト作成は必要ありませんでした。最近、ネット管理者の職に就いたところ、上司から、いくつかの基準に基づいてファイルを移動するスクリプトを作成するように依頼されました。これを達成するためにPowershellを使用しています。

  1. 1 日より新しいファイルは、コピーではなく $path から $destination に移動されます
  2. 除外は、そのままにしておく必要がある callpilot.dev に適用されます
  3. ソース フォルダにあるファイルとすべてのサブフォルダにあるファイルを移動する必要があります
  4. ソース フォルダ構造はそのままにしておく必要があります
  5. 宛先のトップ フォルダには、実際の日付から 1 日を引いた日付が含まれている必要があります
  6. すべてのサブフォルダー構造は、ソース構造と同じ名前を使用して作成する必要があります
  7. 残りのソース ファイルは削除する必要があります (callpilot.dev を除く)。

私のテストフォルダー構造は次のとおりです。

    c:\temp\others\callpilot 
    c:\temp\others\ftps 
    c:\temp\others\mysql 
    c:\temp\others\rss-enterprise 
    c:\temp\others\rss-sql2k8 
    c:\temp\others\tree.txt 
    c:\temp\others\callpilot\example2.gz 
    c:\temp\others\callpilot\backup.gz 
    c:\temp\others\callpilot\barnak.bak 
    c:\temp\others\callpilot\callpilot.dev 
    c:\temp\others\callpilot\IPESystemBackup 131022 2000.bkp 
    c:\temp\others\ftps\www.123.com 
    c:\temp\others\ftps\www.123.com\backup-10.22.2013_00-00-08_123.tar.gz 
    c:\temp\others\ftps\www.123.com\backup-10.23.2013_00-00-08_123.tar.gz 
    c:\temp\others\ftps\www.123.com\backup-10.4.2013_00-00-07_123.tar.gz 
    c:\temp\others\mysql\sql.txt 
    c:\temp\others\rss-enterprise\enterprise.txt 
    c:\temp\others\rss-sql2k8\data 
    c:\temp\others\rss-sql2k8\data\New Bitmap Image.bmp 
    c:\temp\others\rss-sql2k8\data\New Journal Document.jnt 
    c:\temp\others\rss-sql2k8\data\New Microsoft PowerPoint Presentation.pptx 
    c:\temp\others\rss-sql2k8\data\New Microsoft Visio Drawing.vsd

これが私のスクリプトです:

$date = get-date 
$path = "C:\temp\others\*.*"
$destination = new-item "c:\temp\others\$($date.toshortdatestring().replace("/","-"))" -type directory
Foreach($file in (Get-ChildItem $path -file -recurse -exclude "callpilot.dev")) 
{ 
    If($file.LastWriteTime -gt (Get-Date).adddays(-1).date) 
    { 
        Move-Item -Path $file.fullname -Destination $destination 
    } 
}

6号と7号が行方不明です。それらを見つけるのを手伝ってくれませんか?


お返事頂きました、ありがとうございます。何かがまだ正しく機能していません。

これが私のスクリプトです:

$date = get-date
$path = "C:\temp\others\*.*"
$destination = new-item "c:\temp\others\$($date.toshortdatestring().replace("/","-"))" -type directory

Foreach($file in (Get-ChildItem $path -file -recurse -exclude "callpilot.dev"))
{
    If($file.LastWriteTime -gt (Get-Date).adddays(-2).date)
{
        $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root.ToString())
        New-Item $destination -Type Directory -ea SilentlyContinue
        Move-Item $file $destination
    } else {
        Remove-Item $file
}
}

ファイルは移動されましたが、フォルダーは作成されませんでした。エラーは次のとおりです。

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Move-Item : Cannot create a file when that file already exists.
At C:\temp\organize_final222.ps1:11 char:9
+         Move-Item $file $destination
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : WriteError: (C:\temp\others\...sio Drawing.vsd:FileInfo) [Move-Item], IOException
+ FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

Method invocation failed because [System.IO.DirectoryInfo] doesn't contain a method named 'op_Addition'.
At C:\temp\organize_final222.ps1:9 char:9
+         $destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

適切な場所にあなたのセリフを挿入しましたか?

4

1 に答える 1

0

$file.DirectoryName.TrimStart($file.Directory.Root.ToString())ドライブ名なしでソース フォルダー パスを取得するために使用できるため、これで #6 が処理されます。

$destination += '\' + $file.DirectoryName.TrimStart($file.Directory.Root.ToString())
New-Item $destination -Type Directory -ea SilentlyContinue
Move-Item $file $destination

いくつかのメモ:

  • 最初の行は、元のパス (ドライブ文字を除く) を$destinationに追加します。
  • 2 行目は、宛先ディレクトリが存在しない場合に作成します。-ea SilentlyContinue宛先ディレクトリがすでに存在する場合に文句を言うのを防ぎます。あなたはアナルになって することもできますがif (! (Test-Path $destination)) {New-Item ...、それは時間の無駄だと思います.
  • パラメーター名-Path-Destinationは位置によって暗示されるため、省略できます (詳細については、Google の「powershell 位置パラメーター」を参照してください)。
  • FullNameプロパティを読み取る必要はありません。文字列パラメーターに文字列以外の引数を指定すると、PowerShell は引数に対してToString()メソッドを自動的に呼び出します。Move-Item $file $destは と同じで、 FileInfoオブジェクトでToString()Move-Item $file.ToString() $destメソッドを呼び出すと、 FullNameが得られます。プロパティ (これは、オブジェクト クラス定義によって指定されます)。これはマイナーなポイントのように思えるかもしれませんが、慣れると不要なタイピングが大幅に減ることに気付くでしょう。一般的なルールは、直感的に機能するように思われる場合は、おそらく機能するということです(オブジェクトのプロパティを指定するような凝ったことをせずに、ファイルオブジェクトを移動するように指示することができるはずです- - だからあなたはできる。)

#7 では、 else句を追加して、条件に一致しないソース ファイルを削除します。

if ($file.LastWriteTime -gt (Get-Date).AddDays(-1).Date) {
  Move-Item $file "$destination\$($file.DirectoryName.TrimStart($file.Directory.Root.ToString()))"
} else {
  Remove-Item $file
}

安全のために、 でテストを実行しRemove-Item -WhatIf $fileて、目的の結果が得られていることを確認することをお勧めします。スクリプトの先頭で宣言[CmdletBinding(SupportsShouldProcess=$true)]し、スクリプト全体を-WhatIfで実行することをお勧めしますが、それはおそらく、現在取得したいよりも高度です。重要な部分は、スクリプトに多数の元に戻せない変更を加える前に、常に非破壊的なテストを実行することです。

于 2013-10-25T19:58:53.273 に答える