2015-01-28 3 views
1

У меня есть пакетный скрипт, который принимает> = 1 файл через drag & drop. Полные пути хранятся в массиве и затем передаются в другую программу в качестве входных данных. Имя файла + расширение хранится в другом массиве, который затем отображается пользователю.Пакетный скрипт, перетаскивание и перетаскивание файла, расширение и перезагрузка файла

Я пытаюсь проверить расширение файла, и если оно не является .bin, автоматически переименуйте файл, который я перетащил &, упал на .bin и перезагрузил его для добавления к двум массивам. Как я могу это сделать? Я пробовал некоторые команды if или %% ~ xi, но обычно он не обнаруживает, правильно ли это .bin или нет, и, конечно, путь не обновляется в массиве.

@echo off 
pushd %~dp0 
setlocal enabledelayedexpansion 
set /a Count = 0 

:START 
    set file="%~1" 
    if %file%=="" goto RUN 
    for %%i in (%file%) do set name=%%~nxi 
    set /a Count += 1 
    set [FilePath.!Count!]=%file% 
    set [FileName.!Count!]=%name% 
    shift 
goto START 

:RUN 
for /l %%i in (1, 1, %Count%) do (
    program.exe -command "![FilePath.%%i]!" 
    echo. 
    echo File Name: ![FileName.%%i]! 
    echo. 
    pause 
    cls 
    if exist file.log del file.log 
) 

ответ

1

Вы можете просто переименовать его во время совокупности массивов. Есть несколько других потенциальных проблем с вашим сценарием (например, pushd в некотируемом каталоге, delayedexpansion, где он не нужен, где он будет потенциально сбивать имена файлов, содержащих восклицательные знаки, и if %file%=="" должен содержать "%file%"). И действительно нет причин поддерживать массив имен файлов или цикл дважды. Ваш скрипт намного сложнее, чем нужно.

@echo off 
setlocal 

pushd "%~dp0" 

for %%I in (%*) do (
    if /I not "%%~xI"==".bin" move "%%~fI" "%%~dpnI.bin" >NUL 
    program.exe -command "%%~dpnI.bin" 
    echo; 
    echo File Name: "%%~nxI" 
    echo; 

    rem If you want to rename the file back the way it was after running 
    rem program.exe on it, uncomment the following line: 
    rem if /I not "%%~xI"==".bin" move "%%~dpnI.bin" "%%~fI" >NUL 

    pause 
    cls 
    if exist file.log del file.log 
) 
+0

Большое спасибо, это работает отлично. Моя следующая забота заключалась в том, чтобы сохранить файл с тем же расширением, который вы добавили, и работает. Теперь, чтобы проверить, правильно ли я понял изменения: 1)% I -> файл с перетаскиванием и сбросом 2)% * -> условие, вернет false после последнего сброшенного файла? 3) %% ~ fI -> расширяет% I до полного пути (не было ли уже после% I)? 4)% ~ dpnI -> расширяет% I на диск, путь, имя и добавляет .bin (желаемое расширение) – Plato

+0

5)> NUL -> Я прочитал, что он поддерживает уведомление о перемещении, поэтому эффект только визуальный 6)% ~ dpnI.bin -> программа загружается% I с правильным расширением, где находится этот файл (временная папка)? 7) В элементе FileName echo, если расширение% I теперь переименовано правильно, не можем ли мы использовать %% ~ nxI? В основном я не знаю, как работала команда перемещения оператора IF. Вы можете объяснить это, пожалуйста? – Plato

+0

** 1: ** Да. ** 2: ** Просто проходит все аргументы. Если аргументов нет, то ничего не происходит. Нет возврата. ** 3: ** Да, но нет никакой двусмысленности с '%% ~ fI'. ** 4: ** Да. ** 5: ** Да. ** 6: ** Тот же каталог. Я использовал 'move', а не' ren', потому что 'ren' задыхается, если вы не находитесь в том же каталоге, что и файл, который вы переименовываете. ** 7: ** Мы не изменяем действительную переменную '%% I'. Подумайте об этом как о переменной только для чтения. Мы можем переименовать файл, который он содержит, но не можем изменить эту переменную. Поэтому даже после перемещения/переименования '%% I' имеет то же значение, что и в начале цикла. – rojo

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