Kiểm tra xem tệp có tồn tại hay không trong Windows PowerShell?


112

Tôi có tập lệnh này so sánh các tệp trong hai vùng của đĩa và sao chép tệp mới nhất qua tệp có ngày sửa đổi cũ hơn.

$filestowatch=get-content C:\H\files-to-watch.txt

$adminFiles=dir C:\H\admin\admin -recurse | ? { $fn=$_.FullName; ($filestowatch | % {$fn.contains($_)}) -contains $True}

$userFiles=dir C:\H\user\user -recurse | ? { $fn=$_.FullName; ($filestowatch | % {$fn.contains($_)}) -contains $True}

foreach($userfile in $userFiles)
{

      $exactadminfile= $adminfiles | ? {$_.Name -eq $userfile.Name} |Select -First 1
      $filetext1=[System.IO.File]::ReadAllText($exactadminfile.FullName)
      $filetext2=[System.IO.File]::ReadAllText($userfile.FullName)
      $equal = $filetext1 -ceq $filetext2 # case sensitive comparison

      if ($equal) { 
        Write-Host "Checking == : " $userfile.FullName 
        continue; 
      } 

      if($exactadminfile.LastWriteTime -gt $userfile.LastWriteTime)
      {
         Write-Host "Checking != : " $userfile.FullName " >> user"
         Copy-Item -Path $exactadminfile.FullName -Destination $userfile.FullName -Force
       }
       else
       {
          Write-Host "Checking != : " $userfile.FullName " >> admin"
          Copy-Item -Path $userfile.FullName -Destination $exactadminfile.FullName -Force
       }
}

Đây là định dạng của files-to-watch.txt

content\less\_light.less
content\less\_mixins.less
content\less\_variables.less
content\font-awesome\variables.less
content\font-awesome\mixins.less
content\font-awesome\path.less
content\font-awesome\core.less

Tôi muốn sửa đổi điều này để nó tránh làm điều này nếu tệp không tồn tại trong cả hai khu vực và in thông báo cảnh báo. Ai đó có thể cho tôi biết cách kiểm tra xem tệp có tồn tại hay không bằng cách sử dụng PowerShell?

Câu trả lời:


198

Chỉ để cung cấp giải pháp thay thế cho Test-Pathlệnh ghép ngắn (vì không ai đề cập đến nó):

[System.IO.File]::Exists($path)

Có (gần như) điều tương tự như

Test-Path $path -PathType Leaf

ngoại trừ không hỗ trợ các ký tự đại diện



1
@orad Vâng, tôi nhìn thấy nó, đã đăng một câu trả lời với một phủ nhận Tồn tại () cuộc gọi, nhưng đã không được đáp ứng với phản ứng tích cực cùng ;-)
Mathias R. Jessen

5
Việc sử dụng [System.IO.File]::Existscũng giải quyết các đường dẫn tương đối theo cách khác nhauTest-Pathcó thể được sử dụng với các đường dẫn không phải tệp (ví dụ: vị trí đăng ký). Sử dụng Test-Path.
jpmc26

2
Phương thức @Jamie Native .NET thường giải quyết các đường dẫn liên quan đến thư mục làm việc của quy trình, không nhất thiết phải là đường dẫn FileSystem hiện tại trong powershell. Bạn có thể làm[System.IO.File]::($(Join-Path $PWD $path))
Mathias R. Jessen

1
Và trong trường hợp bạn không đoán nó [System.IO.Directory]::Exists($path)dành cho các thư mục. Cả hai đều hỗ trợ đường dẫn UNC trên hệ thống của tôi, nhưng để thực hiện chia sẻ ẩn, hãy nhớ thoát khỏi $đường dẫn trong đường dẫn là "$"
Chris Rudd

71

Sử dụng Test-Path :

if (!(Test-Path $exactadminfile) -and !(Test-Path $userfile)) {
  Write-Warning "$userFile absent from both locations"
}

Đặt đoạn mã trên vào ForEachvòng lặp của bạn sẽ làm được những gì bạn muốn


22

Bạn muốn sử dụng Test-Path:

Test-Path <path to file> -PathType Leaf

7

Cách chuẩn để xem tệp có tồn tại hay không là sử dụng Test-Pathlệnh ghép ngắn.

Test-Path -path $filename

6

Bạn có thể sử dụng Test-Pathcmd-let. Vì vậy, một cái gì đó giống như ...

if(!(Test-Path [oldLocation]) -and !(Test-Path [newLocation]))
{
    Write-Host "$file doesn't exist in both locations."
}

0
cls

$exactadminfile = "C:\temp\files\admin" #First folder to check the file

$userfile = "C:\temp\files\user" #Second folder to check the file

$filenames=Get-Content "C:\temp\files\files-to-watch.txt" #Reading the names of the files to test the existance in one of the above locations

foreach ($filename in $filenames) {
  if (!(Test-Path $exactadminfile\$filename) -and !(Test-Path $userfile\$filename)) { #if the file is not there in either of the folder
    Write-Warning "$filename absent from both locations"
  } else {
    Write-Host " $filename  File is there in one or both Locations" #if file exists there at both locations or at least in one location
  }
}

-4

Test-Path có thể đưa ra câu trả lời kỳ lạ. Ví dụ: "Test-Path c: \ temp \ -PathType leaf" cho sai, nhưng "Test-Path c: \ temp * -PathType leaf" cho đúng. Buồn :(

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.