質問

同じ名前の同じ名前のファイルが2つ以上あるかどうかを確認するために、一連のディレクトリとサブディレクトリをチェックしようとしています。私の問題は私が文字列を検証しようとしている方法です。

次のテストディレクトリの場合:

  • | - C:\ TEST \
    • | --C:\ test \ yy \
      • | --c:\ test \ yy \ xx.log
      • | --C:\ test \ yy \ xx.txt
    • | - C:\ TEST \ ZZ \
    • | - C:¥TEST¥zz.log
    • | - C:¥test¥zz.txt

xx.logとzz.logを見つけるためのコードが必要です。$_.PSisContainerに対するチェックを含めることができます(しかし、私はそれが必要だとは思わなかった)。

ForEach ($item in (gci "C:\Test\*" -recurse)) {
    If ($item.extension -notmatch "txt" -AND $item.basename+".txt" -eq $True) {
        Write-Host $item.fullname
        } 
    }
.

$item.basename+".txt"正しい文字列を提供しますが、ファイルの存在を検証するためにその文字列を使用することはできません。

誰かが私のコードを修正するのを助けることができますか?このような連結された文字列を処理する方法を学びたいです - それは他の地域で役立つだろうと思うトリックです。

役に立ちましたか?

解決

これは答えとして意図されていませんが、コメントは私が今コメントを追加することを許可していません:(

r_c_iii - 私は元のコードに2つのエラーがあると思います。

最初に、完全なファイルパス(すなわちDirectoryName + Basename + .txt)を作成しません。これを行うための文字列を連結するのではなく、キースは二重引用された文字列の内側に値置換を実行するPowerShellの能力を使用しました。 e.g.

$s = "there"
write-host "hello $s"
.

結果

hello there
.

オブジェクトプロパティを文字列に挿入するには、キーを説明するにつれてサブ式を使用する必要があります。

$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"
.

結果

c:\somefile.NEW
.

第二に(キースの回答に関する私のコメントに従って)、元のコードは '.txt'バージョンのファイルの存在をチェックしません。 IFステートメントの2番目の句は、$ true($ item.baseName + "txt" -eq $ true)を持つ変更されたファイル名を同等にしようとします。この句は常に偽として評価されます。

keithの修正は 'test-path'コマンドレットを追加します。この場合は '.txt'ファイルの存在をチェックします。

他のヒント

これを試してみてください:

gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}
.

PowerShellコマンドとして、パイプラインの開始時に直接使用できるPowerShellコマンドとして最初のForeachステートメントを必要としません。その後、PipelineオブジェクトをWhereコマンドでフィルタリングします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top