Windows PowerShell'de bir dosyanın var olup olmadığını kontrol edin.


112

Diskin iki alanındaki dosyaları karşılaştıran ve en son dosyayı eski değiştirilmiş tarihin üzerine kopyalayan bu komut dosyasına sahibim.

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

İşte watch.txt dosyalarının formatı

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

Bunu, dosya her iki alanda da yoksa ve bir uyarı mesajı yazdırıyorsa bunu yapmaktan kaçınacak şekilde değiştirmek istiyorum. Birisi bana PowerShell kullanarak bir dosyanın var olup olmadığını nasıl kontrol edebileceğimi söyleyebilir mi?

Yanıtlar:


199

Sadece sunmak için alternatif için Test-Pathcmdlet'in (kimse söz beri):

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

(Neredeyse) aynı şeyi yapar

Test-Path $path -PathType Leaf

joker karakterler için destek olmaması dışında



1
@orad Evet, gördüm, reddedilmiş bir Exists () çağrısıyla bir yanıt gönderdim, ancak aynı olumlu yanıtla karşılaşmadım ;-)
Mathias R. Jessen

5
[System.IO.File]::ExistsAyrıca kullanmak , göreli yolları farklı şekilde çözer ve Test-Pathdosya yolu olmayan yollarla da kullanılabilir (örneğin, kayıt defteri konumları). Kullanın Test-Path.
jpmc26

2
@Jamie Yerel .NET yöntemleri, powershell'deki geçerli FileSystem yolu değil, genellikle işlemin çalışma dizinine göre yolları çözer. Yapabilirsin[System.IO.File]::($(Join-Path $PWD $path))
Mathias

1
Ve [System.IO.Directory]::Exists($path)klasörler için olduğunu tahmin etmediyseniz . Her ikisi de sistemimdeki UNC yollarını destekliyor, ancak gizli paylaşımlar yapmak $için yoldan "$" olarak kaçmayı unutmayın
Chris Rudd

71

Test Yolunu Kullan :

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

Yukarıdaki kodu döngünüze yerleştirmek ForEachistediğinizi yapmalıdır


22

Kullanmak istiyorsunuz Test-Path:

Test-Path <path to file> -PathType Leaf

7

Bir dosyanın var olup olmadığını görmenin standart yolu Test-Pathcmdlet'tir.

Test-Path -path $filename

6

Test-PathCmd-let'i kullanabilirsiniz . Yani şöyle bir şey ...

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 Yolu garip cevaplar verebilir. Örneğin, "Test-Yolu c: \ temp \ -YolTürü yaprağı" yanlış verir, ancak "Test-Yolu c: \ temp * -YolTürü yaprağı" doğru verir. Üzgün ​​:(

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.