6

你好,我正在尝试将文件从 IE 缓存复制到其他地方。这适用于 w7,但不适用于 Vista Ultimate。

简而言之:

复制项目 $f -Destination "$targetDir" -force

(我也试过 $f.fullname)

完整脚本:

$targetDir = "C:\temp"
$ieCache=(get-itemproperty "hkcu:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders").cache

$minSize = 5mb
Write-Host "minSize:" $minSize
Add-Content -Encoding Unicode -Path $targetDir"\log.txt" -Value (get-Date)

Set-Location $ieCache
#\Low\Content.IE5 for protected mode
#\content.ie5 for unprotected

$a = Get-Location 

foreach ($f in 
        (get-childitem -Recurse -Force -Exclude *.dat, *.tmp | where {$_.length -gt $minSize})
        )
        {           
        Write-Host (get-Date)   $f.Name $f.length       
        Add-Content -Encoding Unicode -Path $targetDir"\log.txt" -Value $f.name, $f.length
        copy-item $f -Destination "$targetDir" -force
        }

智慧尽头。请帮忙!

4

2 回答 2

9

每当您在尝试找出参数在 PowerShell 中无法正确绑定时遇到问题时,请像这样使用 Trace-Command:

Trace-Command -Name ParameterBinding -expr { copy-item $f foo.cat.bak } -PSHost

在这种情况下,它对我有用。也许这是 PowerShell 2.0 的一个“功能”,但您可以看到它在触发之前尝试绑定几个不同的时间:

COERCE arg to [System.String]
    Trying to convert argument value from System.Management.Automation.PSObject to System.String
    CONVERT arg type to param type using LanguagePrimitives.ConvertTo
    CONVERT SUCCESSFUL using LanguagePrimitives.ConvertTo: [C:\Users\Keith\foo.cat]

当 FileInfo 对象通过管道传递时,这通常会起作用,它们通过“PropertyName”绑定到 LiteralPath 参数。我知道,您可能想知道,呃,您认为 System.IO.FileInfo 没有 LiteralPath 属性。呵呵,不会的。那些狡猾的 PowerShell 人员将 PSPath 别名偷偷带入 LiteralPath 参数,并且 PowerShell “适应”每个 FileInfo 对象以添加许多 PS* 属性,包括 PSPath。因此,如果您想“从字面上”匹配您将使用的流水线行为:

Copy-Item -LiteralPath $f.PSPath $targetDir -force

请注意,在这种情况下,您不必引用 $targetDir(作为参数参数)。

于 2010-03-21T06:50:46.783 回答
3

copy-item不起作用的原因是您System.IO.FileInfo作为参数传递-path。如何正确执行有两种可能性:

  1. copy-item -literal $f.Fullname -destination ...
  2. $f | copy-item -destination ...

请注意,我使用参数-literalPath是因为临时文件夹中的文件通常在名称[]具有充当通配符的名称。

如果您想知道为什么案例 #2 有效,请查看“help Copy-Item -Parameter Path”,您将看到接受管道输入?真(按值,按属性名称)。有关这意味着什么的更多信息,请查看 Keith 的电子书Effective Windows PowerShell

为什么你的版本不起作用?因为 paramerer -path(位于位置 1)接受 type[string[]]而不是的输入FileInfo。因此 PowerShell 尝试将其转换为[string](然后转换为数组),但它可能只使用了Name属性。你可以这样尝试:

[string[]] (gci | select -first 1)

于 2010-03-21T00:18:44.833 回答