Получить первый символ A_LoopFileName? - PullRequest
0 голосов
/ 14 января 2020

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

FileSelectFolder, WhichFolder  ; Ask the user to pick a folder.

; Ask what letter you want to start the loop from
InputBox, UserInput, Start At What Letter?, Please enter a letter to start at within the folder (CAPITALIZE IT!)., , 450, 150

if ErrorLevel {
    MsgBox, CANCEL was pressed.
    ExitApp
} else {
    inputted_letter = %UserInput%
    tooltip %inputted_letter%       ; Show the inputted letter
    sleep, 2000
    tooltip
}

Loop, %WhichFolder%\*.*
{

    current_filename_full = %A_LoopFileName%

    files_first_letter := SubStr(current_filename_full, 1, 1)
    tooltip %files_first_letter%             ; Show the file's first letter
    sleep, 2000
    tooltip

    if files_first_letter != inputted_letter
        continue
...

Прямо сейчас он четко показывает во всплывающих подсказках введенную пользователем заглавную букву, а затем первую букву каждого имени файла из выбранной папки, но по какой-то причине, когда эти двое похожи друг на друга, он не признает их как совпадение. Я думаю, может быть, потому что технически A_LoopFileName не является строковым типом? Или, может быть, введенная буква не соответствует типу буквы первого имени файла?

Я хочу, чтобы оно было continue, если введенная буква и первая буква имени файла не совпадают, но если они совпадают, чтобы продолжить с остальной частью сценария. Любые идеи о том, как я могу получить эти два, чтобы успешно соответствовать? Спасибо!

1 Ответ

1 голос
/ 14 января 2020

Во-первых, у AHK действительно нет типов. По крайней мере, не так, как вы сталкивались с типами в других языках.
Так что ваше предположение о «неправильном типе» почти всегда будет неверным.
Так что настоящая причина в том, что в устаревшем Если оператор, синтаксис
if <name of variable> <operator> <legacy way of representing a value>
Таким образом, вы бы сделали это так:
if files_first_letter != %inputted_letter%
Вы сравниваем, если переменная files_first_letter равна литералу text inputted_letter.

Однако я настоятельно рекомендую вам прекратить использовать устаревший синтаксис. Это действительно так просто. Он будет сильно отличаться от любого другого языка программирования, и вы столкнетесь с таким странным поведением. Синтаксис выражения - это то, что вы хотите использовать в AHK в наши дни.

Вот ваш фрагмент кода, преобразованный в синтаксис выражения на случай, если вам интересно:

FileSelectFolder, WhichFolder

;Forcing an expression like this with % in every parameter 
;is really not needed of course, and could be considered
;excessive, but I'm doing it for demonstrational
;purposes here. Putting everything in expression syntax.
;also, not gonna lie, I always do it myself haha
InputBox, UserInput, % "Start At What Letter?", % "Please enter a letter to start at within the folder (CAPITALIZE IT!).", , 450, 150

if (ErrorLevel) 
;braces indicate an expression and the non-legacy if statement
;more about this, as an expression, ErrorLevel here holds the value
;1, which gets evaluated  to true, so we're doing 
;if (true), which is true
{
    MsgBox, % "CANCEL was pressed."
    ExitApp
} 
else 
    inputted_letter := UserInput ; = is never used, always :=


Loop, Files, % WhichFolder "\*.*" 
;non-legacy file loop
;note that here forcing the expression statement
;with % is actually very much needed
{

    current_filename_full := A_LoopFileName
    files_first_letter := SubStr(current_filename_full, 1, 1)

    if (files_first_letter != inputted_letter)
        continue
}

Также вам не нужно будьте обеспокоены регистром с !=, он всегда будет сравнивать регистр без учета.

...