2010-03-20 5 views
3

안녕하세요, IE 캐시에서 다른 곳으로 파일을 복사하려고합니다. 이것은 w7에서 작동하지만 Vista Ultimate에서는 작동하지 않습니다. 한마디로경고없이 PowerShell 복사가 실패합니다.

:

복사 항목 $ f를 -destination

(나는 또한 $ f.fullname 시도)

"$ TARGETDIR"-force

전체 스크립트를

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

지혜의 끝. 도와주세요!

답변

3

copy-item이 작동하지 않는 이유는 을 매개 변수 -path으로 전달해야하기 때문입니다.

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

참고 임시 폴더에있는 파일은 역할 이름 안에 보통 []을 가지고 있기 때문에 나는 매개 변수 -literalPath를 사용 제대로 수행하는 방법 두 가지 가능성이 있습니다 와일드 카드 문자로.

왜 케이스 # 2가 작동하는지 궁금하다면 'help Copy-Item -Parameter Path`를보고 파이프 라인 입력을 허용 하시겠습니까? true (ByValue, ByPropertyName)입니다. Keith의 전자 책 Effective Windows PowerShell을 살펴보십시오.

왜 버전이 작동하지 않습니까? 매개자 -path (위치 1에 있음)은 [string[]]이 아닌 FileInfo이 아닌 입력을 취하기 때문입니다. 따라서 PowerShell은 [string] (그리고 배열로)을 변환하려고했지만 아마도 Name 속성 만 사용했을 것입니다. 이처럼 시도 할 수 있습니다 : 당신이 매개 변수가 PowerShell에서 제대로 결합하지 않는 이유를 알아 내려고하는 데 문제가

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

6

언제, 그래서 같이 추적-명령을 사용하여

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

이 경우, 그것은 나를 위해 작동합니다. 그들이 결합,

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 개체가 파이프 라인을 통해 전달 될 때이 정상적으로 작동하는 방법 : 아마도이 PowerShell을 2.0의 "기능은"하지만 당신은 그것에서 안타 전에 여러 번 바인드를 시도 볼 수 있습니다 LiteralPath 매개 변수에 "PropertyName"을 지정합니다. 나도 알아, 아마 궁금해 할 것 같은데, System.IO.FileInfo에 LiteralPath 속성이 있다고 생각하지 않았을거야. Heheh, 그렇지 않습니다. 까다로운 PowerShell 사용자는 PSPath 별칭을 LiteralPath 매개 변수에 넣고 PowerShell은 각 FileInfo 개체를 "적용하여 PSPath를 비롯한 여러 PS * 속성을 추가합니다. 당신이 "그대로"파이프 라인 동작을 일치하기를 원한다면 그래서 당신은 사용합니다 : 당신이 (매개 변수 인수로)이 경우 TARGETDIR $을 인용 할 필요는 없습니다

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

참고.