Вопрос

Я пытаюсь проверить серию каталогов и подкаталоги, чтобы увидеть, есть ли два или более файлов с тем же именем в той же папке.Я думаю, что моя проблема заключается в том, как я пытаюсь проверить строку.

Для следующего тестового каталога:

    .
  • | - 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 - я думаю, что в исходном коде есть два ошибки.

Во-первых, он не создает полный путь к файлу (i.e. DirectoryName + baseName + .txt). Вместо того, чтобы соединить строки, чтобы сделать это, Кит использовал способность PowerShell выполнять ценные замены внутри двойных цитируемых строк. например.

$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 пытается приравнивать модифицированное имя файла с $ True ($ item.baseName + ". TXT" -EQ $ true). Этот пункт всегда будет оценивать как false.

Модификация Кейта Добавляет командлет «Тестовый путь», который в этом случае проверяет наличие файла «.txt».

Другие советы

Попробуйте:

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

Вам не нужен начальный оператор Foreach, так как PowerShell команды, которые выходные данные могут быть использованы непосредственно в начале трубопровода.Затем вы используете объекты трубопровода с помощью команды Where.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top