0

我正在使用 powershell 创建一个存根脚本。我对这个脚本的意图是将过去 x 时间段内未写入的任何数据复制到新位置,检查文件是否已复制,在其原始位置创建“存档”文件的快捷方式,并最终删除旧文件(我还没有写这部分)。以下是我到目前为止所拥有的。我现在遇到的问题是创建了一个快捷方式,但是所有快捷方式都保存到 C:\Temp 目录而不是任何子文件夹中;如果那是原始文件的存储位置。我认为我的问题在于 $link,我需要拆分路径并加入它们,但我不确定。非常感谢任何帮助!

# Variables
$Original = "C:\Temp"
$Archive = "\\data\users\Temp"

Get-ChildItem -Path $Original -Recurse |
Where-Object {
    $_.LastWriteTime -lt [datetime]::Now.AddMinutes(-1)
} | Copy-Item -Destination $Archive -Recurse -force

$sourceFiles = Get-ChildItem $Original -Recurse | Where-Object { $_.LastWriteTime -lt [datetime]::Now.AddMinutes(-1) } | Select Name, Fullname
$destFiles = Get-ChildItem $Archive -Recurse | Select Name, Fullname

$Comparison = Compare-Object $sourceFiles.name $destFiles.name 

If ($comparison.sideindicator -ne "<=") {
    get-childitem $Archive -Recurse | where { $_.PsIsContainer -eq $false } | ForEach-Object {
        $path = '"' + $_.FullName + '"'
        $link = $Original + '\' + $_.Basename + '.lnk'
        $wshell = New-Object -ComObject WScript.Shell
        $shortcut = $wshell.CreateShortcut($link)
        $shortcut.TargetPath = $path
        $shortcut.Save()
    }
}

If ($comparison.sideindicator -eq "<=") {
    $comparison.inputobject, $sourceFiles.fullname | Out-File  'C:\ScriptLogs\stubbing.csv' -Force
}
4

1 回答 1

0

这是有问题的代码:

$link = $Original + '\' + $_.Basename + '.lnk'

Basename只是没有路径的文件名部分,因此 .lnk 文件直接在顶级目录中结束。

您必须像这样使用相对路径:

$RelativePath = [IO.Path]::GetRelativePath( $Archive, $_.FullName ) 
$link = [IO.Path]::ChangeExtension( "$Original\$RelativePath", 'lnk' ) 

这需要 .NET 5 用于GetRelativePath. 要支持较旧的 .NET 版本,您可以使用:

Push-Location $Archive
try     { $RelativePath = Resolve-Path -Relative $_.FullName }
finally { Pop-Location }

Resolve-Path -Relative使用当前位置作为基准。所以我们使用Push-Location来临时改变当前位置。/用于确保恢复原始位置,即使在抛出异常的情况下try(例如,当您设置了)。finallyResolve-Path$ErrorActionPreference = 'Stop'


虽然代码可能像这样工作,但我认为它可以像这样重构:

  • 一次Get-ChildItem调用来存储要移动到数组中的文件(您的当前$sourceFiles = ...行)
  • foreach此数组上循环以移动每个文件并创建快捷方式。
  • 我认为这Compare-Object甚至没有必要,但也许我错过了一些东西。

目前您正在多次迭代相同的目录,这不是很有效并且有很多重复的代码。

于 2021-02-08T22:08:35.757 回答