移动文件会在指向新位置的原始位置创建快捷方式

时间:2016-10-18 10:53:53

标签: powershell

我有一个PowerShell脚本,可以将所有文件从一个位置移动到另一个位置,其日期修改时间超过3年。我有它,所以移动到新位置时的文件也保留了原始文件的结构。

我试图这样做,一旦文件被移动到新位置,它就会在原始目录中创建一个指向文件新位置的快捷方式。

到目前为止,下面是我的脚本,它完成了上述所有操作,减去了快捷方式。

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

2 个答案:

答案 0 :(得分: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字节大小。别担心。

答案 1 :(得分:0)

感谢您的脚本Android Magic。

我已将其修改为:

  1. 将一组文件从源复制到目标
  2. 即使文件夹为空,它也会在目标位置创建相同的文件夹结构
  3. 然后创建指向归档文件的符号链接。在Powershell v5.1中添加了SymbolicLink支持。您必须以Admin身份运行脚本,才能创建Symbolic Link。

如果有任何问题,我想在电子邮件中添加一个功能以及状态摘要,但这是另一天的事情。

$sourceDir = "\\Fileserver1\IT\Vendor"
$archiveTarget = "\\FS-ARCHIVE\Archive\Fileserver1\IT\Vendor"
$rootArchivePath = "\\FS-ARCHIVE\Archive"

$dateToday = Get-Date
$date = $dateToday.AddYears(-3)

# Copy folder structure to Archive
Get-ChildItem -Path $sourceDir -Recurse | 
?{ $_.PSIsContainer } | 
Copy-Item -Destination {Join-Path $archiveTarget $_.Parent.FullName.Substring($sourceDir.length)} -Force

$items = Get-ChildItem $sourceDir -Recurse -Attributes !Directory |
         Where-Object {$_.LastAccessTime -le $date}
foreach ($item in $items)
{
  $withoutRoot = Split-Path -Path $item.FullName
  $destination = $rootArchivePath + $withoutRoot.Remove(0,1)
  $destFile = $destination + "\" + $item

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

  New-Item -ItemType SymbolicLink -Path $withoutRoot -Name $item -Value $destFile -Force -Verbose

}