2009-06-19 32 views
14

Tôi cần tập lệnh PowerShell có thể truy cập thuộc tính của tệp và khám phá thuộc tính LastWriteTime và so sánh nó với ngày hiện tại và trả lại sự khác biệt ngày tháng.Simple PowerShell LastWriteTime so sánh

Tôi có một cái gì đó như thế này ...

$writedate = Get-ItemProperty -Path $source -Name LastWriteTime 

... nhưng tôi không thể cast LastWriteTime đến một "DateTime" datatype. Nó nói, "Không thể chuyển đổi "@ {LastWriteTime = ... ngày ...}" thành "System.DateTime".

Trả lời

18

Hãy thử những điều sau đây.

$d = [datetime](Get-ItemProperty -Path $source -Name LastWriteTime).lastwritetime 

Đây là một phần của tài sản weirdness mục . Khi bạn chạy Get-ItemProperty nó không trả về giá trị mà thay vào đó là tài sản bạn cần phải sử dụng một mức gián tiếp để có được giá trị

+0

Điều đó có hiệu quả! Cảm ơn! –

+1

Khả thi, nhưng không cần thiết mờ đục, tiết và thừa. Xem thay thế của tôi. – brianary

+2

Điều này làm việc cho tôi nhưng như brianary chỉ ra đó là một chút tiết. Tôi không thấy lý do cho phần "-Name LastWriteTime", và nó hoạt động mà không có tham số đó.Tôi đã sử dụng nó thay vào đó: '[datetime] (Get-ItemProperty -Path $ source) .LastWriteTime' –

2

sử dụng

ls |..% {(được cập nhật) - $ _. LastWriteTime}

Nó có thể hoạt động để tìm ra sự khác biệt. Bạn có thể thay thế ls bằng một tệp.

+0

Cách hoạt động khác! cảm ơn! –

11
(ls $source).LastWriteTime 

("ls", "dir", hoặc "GCI" là bí danh mặc định cho Get-ChildItem.)

4

(Get-Item $source).LastWriteTime là cách ưa thích của tôi để làm điều đó.

6

Tôi có một ví dụ tôi muốn chia sẻ

$File = "C:\Foo.txt" 
#retrieves the Systems current Date and Time in a DateTime Format 
$today = Get-Date 
#subtracts 12 hours from the date to ensure the file has been written to recently 
$today = $today.AddHours(-12) 
#gets the last time the $file was written in a DateTime Format 
$lastWriteTime = (Get-Item $File).LastWriteTime 

#If $File doesn't exist we will loop indefinetely until it does exist. 
# also loops until the $File that exists was written to in the last twelve hours 
while((!(Test-Path $File)) -or ($lastWriteTime -lt $today)) 
{ 
    #if a file exists then the write time is wrong so update it 
    if (Test-Path $File) 
    { 
     $lastWriteTime = (Get-Item $File).LastWriteTime 
    } 
    #Sleep for 5 minutes 
    $time = Get-Date 
    Write-Host "Sleep" $time 
    Start-Sleep -s 300; 
} 
4

Tôi không thể lỗi bất kỳ các câu trả lời vào đây để OP chấp nhận một trong số họ là giải quyết vấn đề của họ. Tuy nhiên, tôi thấy chúng thiếu sót một cách tôn trọng. Khi bạn xuất kết quả của việc gán cho biến, nó chứa nhiều dòng trống, không chỉ là câu trả lời sau khi tìm kiếm. Ví dụ:

PS C:\brh> [datetime](Get-ItemProperty -Path .\deploy.ps1 -Name LastWriteTime).LastWriteTime 

Friday, December 12, 2014 2:33:09 PM 



PS C:\brh> 

Tôi là người hâm mộ của hai điều về mã, tính ngắn gọn và chính xác. brianary có quyền của nó cho gọn gàng với một đầu của mũ để Roger Lipscombe nhưng cả hai đều bỏ lỡ sự chính xác do các dòng phụ trong kết quả. Dưới đây là những gì tôi nghĩ rằng OP đang tìm kiếm vì đó là những gì đã cho tôi trên dòng kết thúc.

PS C:\brh> (ls .\deploy.ps1).LastWriteTime.DateTime 
Friday, December 12, 2014 2:33:09 PM 

PS C:\brh> 

Lưu ý việc thiếu các dòng bổ sung, chỉ một dòng mà PowerShell sử dụng để phân tách lời nhắc. Bây giờ điều này có thể được gán cho một biến để so sánh hoặc, như trong trường hợp của tôi, được lưu trữ trong một tệp để đọc và so sánh trong một phiên sau đó.

1

Hơi dễ dàng hơn - sử dụng lệnh ghép ngắn new-timespan, tạo khoảng thời gian từ thời điểm hiện tại.

ls | where-object {(new-timespan $_.LastWriteTime).days -ge 1} 

hiển thị tất cả các tệp không được ghi vào hôm nay.