我有一个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()
}
答案 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。
我已将其修改为:
如果有任何问题,我想在电子邮件中添加一个功能以及状态摘要,但这是另一天的事情。
$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
}