¿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