2016-10-18 13 views
1

すべてのファイルをある場所から3年以上前に変更された場所に移動するPowerShellスクリプトがあります。私はそれを持っているので、ファイルは新しい場所に移動されたときに元のファイル構造も保持されます。ファイルを移動すると、元の場所に新しい場所を示すショートカットが作成されます

ファイルを新しい場所に移動すると、元のディレクトリにファイルの新しい場所を示すショートカットが作成されます。

これまでのところ私のスクリプトでは、上記をすべて省略したショートカットがあります。

$sourceDir = "C:\Users\bgough\Documents\powershell\docs" 
$archiveTarget = "C:\Users\bgough\Documents\archive" 
$dateToday = Get-Date 
$date = $dateToday.AddYears(-3) 

$items = Get-ChildItem $sourceDir -Recurse | 
     Where-Object {!$_.PSIsContainer -and $_.LastWriteTime -le $date} 

foreach ($item in $items) 
{ 
    $withoutRoot = $item.FullName.Substring([System.IO.Path]::GetPathRoot($item.FullName).Length); 
    $destination = Join-Path -Path $archiveTarget -ChildPath $withoutRoot 

    $dir = Split-Path $destination 
    if (!(Test-Path $dir)) 
    { 
    mkdir $dir 
    } 

    Move-Item -Path $item.FullName -Destination $destination 

    $WshShell = New-Object -ComObject WScript.Shell 
    $Shortcut = $WshShell.CreateShortcut("$sourceDir") 
    $Shortcut.TargetPath = $destination 
    $Shortcut.Save() 
} 

私のスクリプトでは、このショートカットを作成しようとしましたが、役に立たなかったのです。私はまた、次を読みましたが、あまりにもそれをよく理解していない...

How to create a shortcut using Powershell

Powershell Hard and Soft Links

編集:

私は正常に作成するためのショートカットを持って、でてきました元のフォルダ。しかし、ショートカット名として変数を渡す方法を理解できないようです。現時点では、文字列はハードコーディングされています。これがショートカットの名前です。以下のコードを参照してください:名前を項目のフルネーム(移動されたドキュメントと同じ名前)に設定したいと思います。エクスプローラを使用しているとき

$sourceDir = "C:\Users\bgough\Documents\powershell\docs" 
$archiveTarget = "C:\Users\bgough\Documents\archive" 
$dateToday = Get-Date 
$date = $dateToday.AddYears(-3) 

$items = Get-ChildItem $sourceDir -recurse | Where-Object {!$_.PsIsContainer -and $_.LastWriteTime -le $date} 

foreach ($item in $items) 
{ 
    $withoutRoot = $item.FullName.Substring([System.IO.Path]::GetPathRoot($item.FullName).Length); 
    $destination = Join-Path -Path $archiveTarget -ChildPath $withoutRoot 

    $dir = Split-Path $destination 
    if (!(Test-Path $dir)) 
    { 
    mkdir $dir 
    } 

    Move-Item -Path $item.FullName -Destination $destination 

    $wshshell = New-Object -ComObject WScript.Shell 
    $desktop = [System.Environment]::GetFolderPath('Desktop') 
    $lnk = $wshshell.CreateShortcut($sourceDir + "\ShortcutName.lnk") 
    $lnk.TargetPath = "$destination" 
    $lnk.Save() 
} 
+0

ショートカットまたは(シンボリック)リンクを作成しますか?彼らは全く違ったものです。また、あなたの試みは期待どおりにはいかなかったのですか?間違いましたか? –

+0

私はショートカットの後です。また、私はエラーは発生しませんでしたが、元の場所にショートカットがありませんでした。 –

+0

@AnsgarWiechers文法チェックに感謝します。 (一口..) –

答えて

0

.lnkファイルが細かいですが、彼らは、PowerShellのか、コマンドプロンプトでうまく再生できません。

あなたがする必要があるのは、ファイルのシンボリックリンクを作成することです。 Powershellではこれを行うことはできませんが、mklinkというコマンドラインユーティリティがあります。

function CreateLink 
{ 
    param 
    (
     [string] $LinkName, 
     [string] $TargetFile 
    ) 

    &"cmd.exe" /c mklink "$LinkName" "$TargetFile" | Out-Null 
} 

をあなたの例では、あなたがこのようにそれを呼び出します:あなたはそれを呼び出すことができるように、私は機能に包みました

CreateLink -LinkName $item.FullName -TargetFile $destination 

あなたはPowerShellでディレクトリを見てみるとファイルがしますサイズが0バイトであると表示されます。それを心配しないでください。

+0

こんにちはショーン、今日は人生の節約になりました。上記の問題は、このスクリプトが数週間ごとに実行されるようにスケジュールされていることです。 –

+0

@AndroidMagicなぜスケジューリングは上記の問題ですか? – Sean

+0

私はちょうどあなたが意味するものを理解していない悪い: –

関連する問題