2014-06-23 3 views
0

나는이 스크립트를 며칠 동안보고있었습니다. 대부분의 오류를 처리했지만이 오류의 원인을 파악할 수 없습니다. 스크립트는 다음과 같습니다Powershell 디렉터리 삭제 위치 매개 변수 오류

. $Env:JobDir\Scripts\DeleteMethods1.ps1 
#Purge old logs 
Remove-FilesCreatedBeforeDate -Path "$Env:JobDir\Logs\" -DateTime ((Get- Date).AddDays(-30)) 
#Backup log from last run 
if(Test-Path $Env:JobDir\log_*.txt) 
{ 
    Move-Item -force $Env:JobDir\log_*.txt $Env:JobDir\Logs\ 
} 
$logFile = $Env:JobDir + "\log_$(Get-Date -Format ""yyyyMMdd-HHmm"").txt" 
echo "Removing files older than $Env:Days days" >> $logFile 
if($Env:CheckType -eq "Created") 
{ 
    # Remove all files created more than 30 days ago 
    # Optionally use -DeletePathIfEmpty to remove empty directories 
    Remove-FilesCreatedBeforeDate -Path $Env:PathToCleanUp -DateTime ((Get- Date).AddDays($Env:Days)) -DeletePathIfEmpty "$Env:DeletePathIfEmpty" >> $logFile 
} 
if($Env:CheckType -eq "Modified") 
{ 
    # Delete all files that have not been updated in 30 days 
    Remove-FilesNotModifiedAfterDate -Path $Env:PathToCleanUp -DateTime ((Get- Date).AddDays($Env:Days)) "$Env:DeletePathIfEmpty" >> $logFile 
} 
if($Env:CheckType -eq "Accessed") 
{ 
    # Delete all files that have not been accessed in 30 days 
    Remove-FilesNotAccessedAfterDate -Path $Env:PathToCleanUp -DateTime ((Get-Date).AddDays($Env:Days)) "$Env:DeletePathIfEmpty" >> $logFile 
} 
echo "Done removing files older than $Env:Days days" >> $logFile 
cat "$Env:JobDir\log.txt" >> $logFile 

스크립트는 다음 파일에서 함수를 끌어 :

function Remove-EmptyDirectories([parameter(Mandatory=$true)][ValidateScript({Test-Path  $_})][string] $Path, [switch] $DeletePathIfEmpty, 
[DateTime] $OnlyDeleteDirectoriesCreatedBeforeDate = [DateTime]::MaxValue, 
[DateTime] $OnlyDeleteDirectoriesNotModifiedAfterDate = [DateTime]::MaxValue, 
[DateTime] $OnlyDeleteDirectoriesNotAccessedAfterDate = [DateTime]::MaxValue) 
{ 
    Get-ChildItem -Path $Path -Recurse -Force -Directory | Where-Object { (Get- ChildItem -Path $_.FullName -Recurse -Force -File) -eq $null } | 
    Where-Object { $_.CreationTime -lt $OnlyDeleteDirectoriesCreatedBeforeDate -and $_.LastWriteTime -lt $OnlyDeleteDirectoriesNotModifiedAfterDate 
    -and $_.LastAccessedTime -lt $OnlyDeleteDirectoriesNotAccessedAfterDate } | 
    Remove-Item -Force -Recurse 

# If we should delete the given path when it is empty, and it is a directory, and it is empty, and it meets the date requirements, then delete it. 
if ($DeletePathIfEmpty -and (Test-Path -Path $Path -PathType Container) -and (Get-ChildItem -Path $Path -Force) -eq $null -and 
    ((Get-Item $Path).CreationTime -lt $OnlyDeleteDirectoriesCreatedBeforeDate) -and 
    ((Get-Item $Path).LastWriteTime -lt $OnlyDeleteDirectoriesNotModifiedAfterDate) -and 
    ((Get-Item $Path).LastWriteTime -lt $OnlyDeleteDirectoriesNotAccessedAfterDate)) 
{ Remove-Item -Path $Path -Force } 
} 

# Function to remove all files in the given Path that were created before the given date, as well as any empty directories that may be left behind. 
function Remove-FilesCreatedBeforeDate([parameter(Mandatory)][ValidateScript({Test-Path $_})][string] $Path,[parameter(Mandatory)][DateTime] $DateTime,[switch] $DeletePathIfEmpty) 
{ 
    Get-ChildItem -Path $Path -Recurse -Force -File | Where-Object { $_.CreationTime -lt $DateTime } | Remove-Item -Force 
    Remove-EmptyDirectories -Path $Path -DeletePathIfEmpty $DeletePathIfEmpty -OnlyDeleteDirectoriesCreatedBeforeDate $DateTime -OnlyDeleteDirectoriesNotModifiedAfterDate $DateTime -OnlyDeleteDirectoriesNotAccessedAfterDate $DateTime 
} 

# Function to remove all files in the given Path that have not been modified after the given date, as well as any empty directories that may be left behind. 
function Remove-FilesNotModifiedAfterDate([parameter(Mandatory)][ValidateScript({Test-Path $_})][string] $Path, [parameter(Mandatory)][DateTime] $OnlyDeleteDirectoriesNotModifiedAfterDate, [switch] $DeletePathIfEmpty) 
    { 
     Get-ChildItem -Path $Path -Recurse -Force -File | Where-Object { $_.LastWriteTime -lt $OnlyDeleteDirectoriesNotModifiedAfterDate } | Remove-Item -Force 
     Remove-EmptyDirectories -Path $Path -OnlyDeleteDirectoriesNotModifiedAfterDate $OnlyDeleteDirectoriesNotModifiedAfterDate -DeletePathIfEmpty $DeletePathIfEmpty 
    } 
    # Function to remove all files in the given Path that were created before the given date, as well as any empty directories that may be left behind. 
    function Remove-FilesNotAccessedAfterDate([parameter(Mandatory)][ValidateScript({Test-Path $_})][string] $Path, [parameter(Mandatory)][DateTime] $OnlyDeleteDirectoriesNotAccessedAfterDate, [switch] $DeletePathIfEmpty) 
    { 
     Get-ChildItem -Path $Path -Recurse -Force -File | Where-Object { $_.LastAccessTime -lt $OnlyDeleteDirectoriesNotAccessedAfterDate } | Remove-Item -Force 
     Remove-EmptyDirectories -Path $Path -OnlyDeleteDirectoriesNotAccessedAfterDate  $OnlyDeleteDirectoriesNotAccessedAfterDate -DeletePathIfEmpty $DeletePathIfEmpty 
    } 

지금이 스크립트의 객체는 디렉토리를 기어와 오래된 항목을 삭제하는 것입니다. 여기에있는 많은 변수는 환경 적으로 설정된 항목에서 비롯됩니다. 나는이 프로그램을 실행할 때 지금은 내용의 오류 :

Remove-FilesCreatedBeforeDate : A positional parameter cannot be found that 
accepts argument ''. 
+  Remove-FilesCreatedBeforeDate -Path $Env:PathToCleanUp -DateTime 
((Get-Date) ... 
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Remove-FilesCreatedBeforeD 
    ate], ParameterBindingException 
    + FullyQualifiedErrorId : PositionalParameterNotFound,Remove-FilesCreatedB 
    eforeDate 

내가이 너무 오래에서 찾아 봤는데 그것은 간단한 일이 친절이다, 그래서 만약 내가 오류를 볼 수 없습니다 그림. 조언은 환상적 일 것입니다. 미리 감사드립니다 !!!

* 나는 스크립트를 작성한 사람이 아닙니다. 동료가 오류 수정 의무를 가지고 있습니다.

답변

0

"$Env:DeletePathIfEmpty"의 문제는 해당 문장에서 사용하는 유일한 위치 매개 변수이므로 문제가됩니다. 당신은 내가 추측하고있어 그 함수를 호출하는 다른 장소를 바탕으로이를 변경해야

"$Env:DeletePathIfEmpty" 

이에 :

변화가 모두 "수정을 위해 만든해야 할 것 같습니다
-DeletePathIfEmpty "$Env:DeletePathIfEmpty" 

"및"액세스 됨 "확인 유형.

는 의견이 -DeletePathIfEmpty 매개 변수는 하나가 바로 -DeletePathIfEmpty 스위치를 호출하거나 [bool] 유형의 기능을 수정하고 중 하나 $true 또는 $false을 통과해야 것처럼 보이는 [switch]이라고 지적 기준으로합니다.

+0

함수 스크립트는 -DeletePathIfEmpty 매개 변수를 선언하지 않습니다. 스크립트에 조건을 추가하면 "매개 변수 이름 'DeletePathIfEmpty'와 일치하는 매개 변수를 찾을 수 없습니다라는 오류가 발생합니다. [switch ] – user2280319

+0

아, 그래도 문제가 될 수 있습니다. 스위치 매개 변수는 전달 된 경우 '$ true'이고 그렇지 않은 경우에는 '$ false'이므로 일반적으로 값을 설정하지 않습니다. –

+0

그래서''DeletePathIfEmpty'' 변수를 지우지 만'-DeletePathIfEmpty'를 남겨 두었습니다. 삭제 된 것들이 있지만 옳은 것을 삭제 한 것은 확실하지 않습니다. – user2280319