powershell powershell-v3.0

¿Comprobar si un archivo existe o no en Windows PowerShell?



powershell-v3.0 (6)

Tengo este script que compara los archivos en dos áreas del disco y copia el último archivo sobre el que tiene la fecha de modificación anterior.

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

Aquí está el formato de 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

Me gustaría modificar esto para evitar hacerlo si el archivo no existe en ambas áreas e imprime un mensaje de advertencia. ¿Alguien puede decirme cómo puedo verificar si existe un archivo con PowerShell?


La forma estándar de ver si un archivo existe es con el cmdlet Test-Path .

Test-Path -path $filename


Puedes usar el cmd-let de Test-Path . Así que algo como ...

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


Quieres usar Test-Path.

Test-Path <path to file> -PathType Leaf


Solo para ofrecer la alternativa al cmdlet Test-Path (ya que nadie lo mencionó):

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

Hace (casi) lo mismo que

Test-Path $path -PathType Leaf

excepto ningún soporte para caracteres comodín


Test-Path puede dar una respuesta extraña. Por ejemplo, "Test-Path c: / temp / -PathType leaf" da falso, pero "Test-Path c: / temp * -PathType leaf" da verdadero. Triste :(


Utilice Test-Path :

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

Colocar el código anterior en su bucle ForEach debe hacer lo que quiera