6

こんにちは、IE キャッシュから別の場所にファイルをコピーしようとしています。これは w7 では機能しますが、Vista Ultimate では機能しません。

要するに:

copy-item $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 オブジェクトを "適応" させて、PSPath を含む多数の PS* プロパティを追加します。したがって、パイプライン動作を「文字通り」一致させたい場合は、次のようにします。

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

この場合、(パラメーター引数として) $targetDir を引用する必要はないことに注意してください。

于 2010-03-21T06:50:46.783 に答える
3

copy-itemうまくいかない理由はSystem.IO.FileInfo、 parameter として渡すことです-path。正しく行う方法は 2 つあります。

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

-literalPath一時フォルダー内のファイルには、通常[]ワイルドカード文字として機能する名前が含まれているため、パラメーターを使用することに注意してください。

なぜケース 2 が機能するのか疑問に思っている場合は、'help Copy-Item -Parameter Path` を参照してください。Accept pipeline input?と表示されます。true (ByValue、ByPropertyName)。それが何を意味するかについての詳細は、Keith の電子ブック「Effective Windows PowerShell 」を参照してください。

バージョンが機能しないのはなぜですか?パラメータ-path(位置 1 にある) は type[string[]]ではなくの入力を受け取るためFileInfoです。そのため、PowerShell はそれを[string](そして配列に) 変換しようとしましたが、おそらくNameプロパティのみを使用していました。次のように試すことができます。

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

于 2010-03-21T00:18:44.833 に答える