ตรวจสอบว่ามีไฟล์อยู่หรือไม่ใน Windows PowerShell?


121

ฉันมีสคริปต์นี้ซึ่งเปรียบเทียบไฟล์ในสองพื้นที่ของดิสก์และคัดลอกไฟล์ล่าสุดกับไฟล์ที่มีวันที่แก้ไขเก่ากว่า

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

นี่คือรูปแบบของ 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

ฉันต้องการแก้ไขสิ่งนี้เพื่อหลีกเลี่ยงการทำเช่นนี้หากไฟล์ไม่มีอยู่ในทั้งสองพื้นที่และพิมพ์ข้อความเตือน ใครช่วยบอกฉันหน่อยได้ไหมว่าฉันจะตรวจสอบไฟล์โดยใช้ PowerShell ได้อย่างไร

คำตอบ:


209

เพียงเพื่อเสนอทางเลือกให้กับTest-Pathcmdlet (เนื่องจากไม่มีใครพูดถึง):

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

(เกือบ) เหมือนกันกับ

Test-Path $path -PathType Leaf

ยกเว้นไม่รองรับอักขระตัวแทน



1
@orad ใช่ฉันเห็นมันโพสต์คำตอบด้วยการโทรที่มีอยู่ () ที่เป็นลบ แต่ไม่ได้รับการตอบสนองเชิงบวกแบบเดียวกัน ;-)
Mathias R. Jessen

5
การใช้[System.IO.File]::Existsยังแก้ไขเส้นทางสัมพัทธ์ที่แตกต่างกันและTest-Pathสามารถใช้ได้กับไฟล์พา ธ ที่ไม่ใช่ (เช่นตำแหน่งรีจิสทรี) ใช้Test-Path.
jpmc26

2
วิธีการ @Jamie Native .NET มักจะแก้ไขเส้นทางที่สัมพันธ์กับไดเร็กทอรีการทำงานของกระบวนการไม่จำเป็นต้องเป็นพา ธ FileSystem ปัจจุบันใน powershell คุณทำได้[System.IO.File]::($(Join-Path $PWD $path))
Mathias R.Sessen

1
และในกรณีที่คุณเดาไม่ออกว่าเป็น[System.IO.Directory]::Exists($path)โฟลเดอร์ ทั้งสองสนับสนุนเส้นทาง UNC ในระบบของฉัน แต่ในการทำหุ้นที่ซ่อนอยู่อย่าลืมหลีกหนี$ในเส้นทางเป็น "$"
Chris Rudd

74

ใช้Test-Path :

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

การวางโค้ดด้านบนในForEachลูปควรทำในสิ่งที่คุณต้องการ




6

คุณสามารถใช้Test-Pathcmd-let บางอย่างเช่น ...

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

-5

Test-Path อาจให้คำตอบแปลก ๆ เช่น "Test-Path c: \ temp \ -PathType leaf" ให้ค่าเป็นเท็จ แต่ "Test-Path c: \ temp * -PathType leaf" ให้ค่า true เศร้า :(

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.