Ü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?

Samantha JT Star
quelle

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

Mathias R. Jessen
quelle
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

arco444
quelle
22

Sie möchten verwenden Test-Path:

Test-Path <path to file> -PathType Leaf
GodEater
quelle
6

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

Test-Path -path $filename
Mike Shepard
quelle
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."
}
Speerian
quelle
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
  }
}
MA Charlotte
quelle
-4

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

Zoltan Hernyak
quelle