Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Имя в переменную и запуск приложения для разных файлов в папке (http://forum.oszone.net/showthread.php?t=315070)

Sta1917 20-05-2016 23:16 2636351

Имя в переменную и запуск приложения для разных файлов в папке
 
Здравствуйте. Помогите пожалуйста, сам не могу сообразить.
Есть папка с различными файлами, из которой запускается батник, выполняющий программу на работу с файлом *.txt преобразуя его в "txt.kml":
Код:

"%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" -w -i unicsv -f "%~dp0*.txt" -o kml -F "%~dp0\txt.kml"
Программа работает если в папке только один файл.
Необходимо написать код со следующими условиями:
1. Добавить в текстовый файл первой строкой текст типа "Name,Long,Lat"
2. Чтобы вместо "txt.kml" было "имя_обрабатываемого_файла.kml"
Опционально:
Если есть такая возможность, запускать этот скрипт для всех txt файлов в папке.

alpap 21-05-2016 00:38 2636361

Сильно не вникая так:
Код:

@echo off
set "d=C:\papka"
for /f "delims=" %%a in ('dir/a-d/b "%d%\*.txt"') do (
 echo:Name,Long,Lat>"%d%\%%~nxa"
 "%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" -w -i unicsv -f "%d%\%%~nxa" -o kml -F "%d%\%%~na.kml"
)
exit/b

.

megaloman 21-05-2016 11:14 2636406

Код:

@Echo Off

If Defined ProgramFiles(x86) (
        Set gpsbabel="%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" -w -i unicsv -f
) Else (
        Set gpsbabel="%ProgramFiles%\GPSBabel\gpsbabel.exe" -w -i unicsv -f
)

FOR %%i IN (*.txt) DO (
        >"%0.tmp" Echo Name,Long,Lat
        >>"%0.tmp" Type "%%i"
        rem move "%0.tmp" "%%i" >nul
        %gpsbabel% "%0.tmp" -o kml -F "%%~ni.kml"
)
del "%0.tmp" 2>nul

Я посчитал, что исходные файлы изменять нельзя, поэтому не вставлял в исходные файлы первой строкой текст типа "Name,Long,Lat", однако при обработке эта строка присутствует в обрабатываемом файле.
Ежели всё-таки это необходимо, уберите rem перед move

alpap,
ИМХО, Вы портите все исходные файлы, там записывается одна строка :Name,Long,Lat вместо исходного контента.
Код:

@echo off
set "d=C:\papka"
for /f "delims=" %%a in ('dir/a-d/b "%d%\*.txt"') do (
 echo:Name,Long,Lat>"%d%\%%~nxa"
 "%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" -w -i unicsv -f "%d%\%%~nxa" -o kml -F "%d%\%%~na.kml"
)
exit/b


alpap 21-05-2016 18:08 2636512

Цитата:

Цитата megaloman
там записывается одна строка :Name,Long,Lat вместо исходного контента. »

согласен, невнимательность, 4я строка в моем коде должна быть такой:
Код:

echo:Name,Long,Lat>$& copy "$"+"%d%\%%~nxa"& move $ "%d%\%%~nxa"
.

Sta1917 22-05-2016 14:19 2636695

megaloman, спасибо, все работает как нужно, иногда в файле бывают русские символы, можно перекодировать обрабатываемый файл в utf-8 without BOM? Нашел код, не получается встроить в Ваш скрипт, чтобы все работало вместе.
Код:

:: Win-1251 to UTF-8
@chcp 1251>nul
@<"in.file">"out.file" (for /f "delims=" %%i in ('find/n /v ""') do @chcp 65001>nul& set x=%%i& cmd/v/c echo[!x:*]^^=!)


Sta1917 30-06-2016 14:03 2646759

Добавил перекодировку с помощью iconv.
Код:

@Echo on

:: =========================================
::      смена кодировки cp1251 на utf-8
:: =========================================

:: создаем папку "utf8"
md utf8
:: перекодируем все файлы с расширением *.txt и *.csv,
:: и кладем их в папку "utf8"
:: в папке с программой должна лежать программа iconv
for %%i in (*.txt *.csv) do ".\iconv\iconv" -t UTF-8 "%%i" > "utf8\%%i"

:: =========================================
::              перевод в *kml
:: =========================================

:: определяем разрядность системы (определяем наличие GPSBabel в установленных программах)
If Defined ProgramFiles(x86) (
        Set gpsbabel="%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" -w -i unicsv -f
) Else (
        Set gpsbabel="%ProgramFiles%\GPSBabel\gpsbabel.exe" -w -i unicsv -f
)

:: добавляем во все файлы *.txt в папке utf8 строку "Name,Latitude,Longitude,Description"
:: конвертируем и кладем их в папку с исходными

FOR %%i IN (".\utf8\*.txt") DO (
        >"%0.tmp" Echo Name,Latitude,Longitude,Description
        >>"%0.tmp" Type "%%i"
        %gpsbabel% "%0.tmp" -o kml -F "%%~ni.kml"
)
del "%0.tmp" 2>nul

:: добавляем во все файлы *.csv в папке utf8 строку "Name;Latitude;Longitude;Description"
:: конвертируем и кладем их в папку с исходными

FOR %%i IN (".\utf8\*.csv") DO (
        >"%0.tmp" Echo Name;Latitude;Longitude;Description
        >>"%0.tmp" Type "%%i"
        %gpsbabel% "%0.tmp" -o kml -F "%%~ni.kml"
)
del "%0.tmp" 2>nul

:: удаляем каталог utf8
rd /s /q "%~dp0\utf8"

exit/b


alpap 30-06-2016 22:30 2646954

Если есть PS, чтобы не качать iconv, можно и так перекодировать:
Код:

@echo off
pushd "C:\papka"
 for %%a in (*.txt) do powershell /nologo /noprofile /command "get-content -encoding windows-1251 '%%a'|out-file -encoding utf-8 'u_%%a'"
popd
exit

.

Sta1917 01-07-2016 15:01 2647188

Как я понял из wiki PowerShell идет начиная с windows 7, в XP его нужно скачивать и устанавливать. Тогда iconv универсальней (буду носить ее рядом со скриптом). Можно будет запустить на любой машине с windows.

Iska 01-07-2016 16:34 2647227

«Универсальней» будет использовать WSH, который точно в комплекте, и который носить не надо.

alpap 01-07-2016 18:25 2647262

Ну да:
Код:

@set @x=0; /*
@echo off
call :Recode "file_in.txt" "file_out.txt" windows-1251 utf-8
exit
 
:Recode [исходный файл] [результирующий файл] [кодировка исходного файла] [кодировка результирующего файла]
  cscript.exe //nologo //e:jscript "%~f0" "%~1" "%~2" "%~3" "%~4"
exit/b
 
*/with (new ActiveXObject('ADODB.Stream')) {
  Charset = WScript.Arguments(2);
  Open();
  LoadFromFile (WScript.Arguments(0));
  Text = ReadText();
  Close();
  Charset = WScript.Arguments(3);
  Open();
  WriteText (Text);
  SaveToFile (WScript.Arguments(1), 2);
  Close();
}

.

Sta1917 18-08-2016 17:58 2661129

alpap, при запуске на win7x64 пишет: Convert.cmd (1, 6) Ошибка компиляции Microsoft JScript: Условная компиляция выключена.
Где-то нужно оператор условной компиляции добавить? Причем на win8.1x64 и win10x64 работает


Время: 22:13.

Время: 22:13.
© OSzone.net 2001-