Überprüfen Sie, ob eine Datei in Windows PowerShell vorhanden ist oder nicht.


97

Ich habe dieses Skript, das Dateien in zwei Bereichen der Festplatte vergleicht und die neueste Datei über die Datei mit dem älteren Änderungsdatum kopiert.

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

Hier ist das Format von 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

Ich möchte dies so ändern, dass dies vermieden wird, wenn die Datei nicht in beiden Bereichen vorhanden ist und eine Warnmeldung ausgegeben wird. Kann mir jemand sagen, wie ich mit PowerShell überprüfen kann, ob eine Datei vorhanden ist?

Antworten:


182

Nur um die Alternative zum Test-PathCmdlet anzubieten (da es niemand erwähnt hat):

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

Tut (fast) das Gleiche wie

Test-Path $path -PathType Leaf

außer keine Unterstützung für Platzhalterzeichen



1
@orad Ja, ich habe es gesehen, eine Antwort mit einem negierten Exists () -Aufruf gepostet, aber nicht die gleiche positive Antwort erhalten ;-)
Mathias R. Jessen

5
Verwendung [System.IO.File]::Existsauch löst relative Pfade unterschiedlich und Test-Pathkönnen mit nicht-Dateipfade (zB Registrierungsstellen) verwendet werden. Verwenden Sie Test-Path.
jpmc26

2
@ Jamie Native .NET-Methoden lösen normalerweise Pfade relativ zum Arbeitsverzeichnis des Prozesses auf, nicht unbedingt den aktuellen Dateisystempfad in Powershell. Sie könnten tun[System.IO.File]::($(Join-Path $PWD $path))
Mathias R. Jessen

1
Und falls Sie nicht erraten haben, dass es sich [System.IO.Directory]::Exists($path)um Ordner handelt. Beide unterstützen UNC-Pfade auf meinem System, aber um versteckte Freigaben zu machen, denken Sie daran, $dem Pfad als "` $ " zu entkommen
Chris Rudd

69

Verwenden Test-Path :

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

Das Platzieren des obigen Codes in Ihrer ForEachSchleife sollte das tun, was Sie wollen


22

Sie möchten verwenden Test-Path:

Test-Path <path to file> -PathType Leaf

6

Die Standardmethode zum Test-PathÜberprüfen, ob eine Datei vorhanden ist, ist das Cmdlet.

Test-Path -path $filename

6

Sie können das Test-Pathcmd-let verwenden. Also so etwas wie ...

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

Testpfad kann ungerade Antwort geben. Beispiel: "Testpfad c: \ temp \ -PathType leaf" gibt false aus, "Testpfad c: \ temp * -PathType leaf" gibt true an. Traurig :(

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.