2015-05-14 2 views
0

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

Get-ChildItem -Recurse -path C:\clntfiles 

этот код дает выход как

Mode    LastWriteTime  Length Name                  
----    -------------  ------ ----                  
-a---   4/29/2015 9:11 AM 6919044 HD 100616 Dec2014.pdf 
-a---   5/1/2015 11:42 AM 7091019 HD 101642 Jan2015.pdf  

Я не хочу Режим LastWriteTime Длина и имя файла без расширения .pdf

выход должен быть как

Dec2014 
Jan2015 

Я не уверен, как отфильтровать это. пожалуйста, сообщите

ответ

1

Начну размещая что-то похожее на ответ Leptonator, но упрощена путем использования Select-Object команда (псевдоним Select используется в коде, потому что это привычка, и я ленив).

$files = Get-ChildItem -Recurse -path C:\clntfiles | Select -ExpandProperty BaseName 

Теперь, когда вы получаете имена файлов без расширения. Но на самом деле вы попросили только часть имен файлов, поскольку первое имя файла - «HD 100616 Dec2014.pdf», и вы указали, что на самом деле хотите вернуть «Dec2014». Мы можем сделать это по-разному, но мой любимый из них - это матч RegEx (потому что RegEx - это потрясающе, и я думаю, что комбо /SubString слишком сложное imho).

Итак, матч RegEx от "\w+$" получит то, что вы хотите. Это разбивается следующим образом:

\w означает любую букву или номер
+ означает 1 или более из них
$ означает конец строки/строки

Так что это 1 или более буквенно-цифровых символов в конце строки. Мы труба наш массив имен файлов в ForEach-Object цикла (псевдоним ForEach используется по привычке), и тогда мы имеем:

$Files | ForEach{ [RegEx]::Matches($_,"\w+$")} 

Теперь это выводит [System.Text.RegularExpressions.Match] объект, который больше, чем вы хотите, но это делает имеют свойство Value, которое именно то, что вы просили!Поэтому мы используем Select -Expand снова для этого свойства и выход именно то, что вы просили:

$files = Get-ChildItem -Recurse -path C:\clntfiles | Select -ExpandProperty BaseName 
$files | ForEach{[regex]::Matches($_,"\w+$")} | Select -Expand Value 

RegEx матчи очень удобно, если вы узнаете о них можно упростить, что совсем немного больше, как это:

gci C:\clntfiles -Rec | ?{$_.BaseName -match "(\w+)$"} | %{$Matches[1]} 

Это одна линии, а также код две строки над ним как следует выводить:

Dec2014 
Jan2015 
+0

Я предполагаю, что это произошло и с вами. Gci C: \ clntfiles -Rec | % {($ _. BaseName -split '\ s +') [- 1]} ' – Matt

+0

Нет, я всегда забываю, что вы можете использовать соответствие RegEx для метода' -split'. Хорошая точка @Matt – TheMadTechnician

+0

Вы, вероятно, можете безопасно использовать метод split, а также с обычным пространством, поскольку некоторые из них могут быть более удобными с решением без регулярных выражений. – Matt

1

Что-то, как это должно сделать это для вас ..

$files = Get-ChildItem -Recurse -path C:\clntfiles 

if ($files -ne $null) 
{ 
    foreach ($file in $files) 
    { 
     $file.BaseName 
    } 
} 

В моей папке, она показывает:

> 2014-03-28_exeresult_file 
> 2014-03-30_exeresult_file 
> 2014-03-31_exeresult_file 
> 2014-04-02_exeresult_file 
> 2014-04-03_exeresult_file 
> 2014-04-04_exeresult_file 
> 2014-04-06_exeresult_file 
> 2014-04-08_exeresult_file 

и действительно .txt файлы Надеюсь, что это помогает!

0

Используйте следующие Get-ChildItem -Recurse -name -path C:\clntfiles. Это даст вам только имена файлов.

Рабочий раствор:

$names = Get-ChildItem -name 
foreach($n in $names) {$n.Substring(0,$n.IndexOf("."))} 

Вы также можете использовать LastIndexOf если часть имени файла .

+0

Он только хочет, чтобы имена и не расширения. – Leptonator

+0

ответ обновлен, чтобы отразить это. – zulq

Смежные вопросы