Windows PowerShellにファイルが存在するかどうかを確認しますか?


112

ディスクの2つの領域にあるファイルを比較し、変更日が古いファイルに最新のファイルをコピーするこのスクリプトがあります。

$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を使用してファイルが存在するかどうかを確認する方法を教えてもらえますか?

回答:


197

提供するだけ 代わりTest-Pathコマンドレットを(誰もがそれを言及していないため):

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

(ほぼ)と同じことをします

Test-Path $path -PathType Leaf

ワイルドカード文字のサポートがないことを除いて



1
@oradはい、私はそれを見て、否定されたExists()呼び出しで回答を投稿しましたが、同じ肯定的な応答はありませんでした;-)
Mathias R. Jessen 2015

5
を使用すると相対パスの解決方法[System.IO.File]::Exists異なりTest-Pathファイルパス以外(レジストリの場所など)でも使用できます。を使用しTest-Pathます。
jpmc26 2018年

2
@Jamie Native .NETメソッドは通常、プロセスの作業ディレクトリに関連するパスを解決しますが、PowerShellの現在のファイルシステムパスである必要はありません。あなたができること[System.IO.File]::($(Join-Path $PWD $path))
Mathias R. Jessen 2018

1
そして、あなたがそれ[System.IO.Directory]::Exists($path)がフォルダのためであると推測しなかった場合に備えて。私のシステム上の両方のサポートUNCパスが、隠された株式は脱出することを忘れないで行うには$、「$ `」などのパスに
クリス・ラッド

71

Test-Pathを使用する:

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

上記のコードをForEachループに配置すると、必要な処理が実行されます。



7

ファイルが存在するかどうかを確認する標準的な方法は、Test-Pathコマンドレットを使用することです。

Test-Path -path $filename

6

Test-Pathcmd-letを使用できます。だから何か...

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

Test-Pathは奇妙な答えを与えるかもしれません。たとえば、「Test-Path c:\ temp \ -PathTypeleaf」はfalseを返しますが、「Test-Path c:\ temp * -PathTypeleaf」はtrueを返します。悲しい:(

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.