PowerShell - Узнайте, есть ли два файла с тем же именем
-
21-12-2019 - |
Вопрос
Я пытаюсь проверить серию каталогов и подкаталоги, чтобы увидеть, есть ли два или более файлов с тем же именем в той же папке.Я думаю, что моя проблема заключается в том, как я пытаюсь проверить строку.
Для следующего тестового каталога:
- .
- | - C: \ test \
- .
- | - c: \ test \ yy \
- .
- | - c: \ test \ yy \ xx.log
- | - c: \ test \ yy \ xx.txt
- | - c: \ test \ yy \
- | - 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
.