检查文件是否存在于 Windows PowerShell 中?

我有这个脚本,它比较文件在磁盘的两个区域,并复制最新的文件超过一个旧的修改日期。

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

下面是 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

我想修改这一点,以避免这样做,如果该文件不存在于这两个领域,并打印一个警告消息。谁能告诉我如何使用 PowerShell 检查文件是否存在?

459778 次浏览

你想使用 Test-Path:

Test-Path <path to file> -PathType Leaf

使用 测试路径:

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

将上面的代码放在 ForEach循环中应该可以实现您想要的效果

查看文件是否存在的标准方法是使用 Test-Pathcmdlet。

Test-Path -path $filename

你可以使用 Test-Path的 cmd-let。

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

只是提供 另一种选择Test-Path cmdlet(因为没有人提到它) :

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

做(几乎)与... ... 相同的事情

Test-Path $path -PathType Leaf

除非不支持通配符

测试路径可能会给出奇怪的答案。例如,“ Test-Path c: temp-PathType leaf”给出 false,但“ Test-Path c: temp *-PathType leaf”给出 true。悲伤:

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