|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Выбор файла по его размеру |
|
CMD/BAT - [решено] Выбор файла по его размеру
|
Новый участник Сообщения: 5 |
Здравствуйте, уважаемые знатоки!
Возникла такая задача. Есть каталог (к примеру Folder), где лежит наш батник. Кроме этого в данном каталоге есть приблизительно 10 других файлов с разными расширениями файлов (xml, mxf, cert) В чем стоит задача: 1. Найти в этом каталоге файлы с определенным расширением, в данном случае .mxf (практика показывает, что их в папке всегда два). 2. Сравнить размеры этих файлов между собой. 3. Если размер файла А.mxf больше размера файла B.mxf - записать полное название файла A (с расширением) в переменную videofile, а название файла В в перемеренную audiofile. И наоборот, если файл В больше - в videofile, файл А в audiofile. Заранее спасибо за помощь. С уважанием. |
|
Отправлено: 22:37, 06-04-2018 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Например, так:
Скрытый текст
@echo off setlocal enableextensions enabledelayedexpansion for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "%~dp0*.mxf" ^| find.exe /c /v ""`) do set /a iTotal = %%i if %iTotal% equ 2 ( set /a iCount = 0 for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "%~dp0*.mxf"`) do ( set /a iCount += 1 set sFileName!iCount!=%%~i set /a iFileSize!iCount! = %%~zi ) if !iFileSize1! lss !iFileSize2! ( set sFileNameSmaller=!sFileName1! set sFileNameBigger=!sFileName2! ) else ( set sFileNameSmaller=!sFileName2! set sFileNameBigger=!sFileName1! ) echo Bigger file [!sFileNameBigger!] echo Smaller file [!sFileNameSmaller!] ) else ( echo Need exactly two files [*.mxf] in directory [%~dp0] exit /b 1 ) endlocal exit /b 0 |
Отправлено: 23:34, 06-04-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Говорит, что большой файл аудио (хотя по размеру он меньше чем другой файл)
Скрытый текст
|
Отправлено: 23:45, 06-04-2018 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать NeroDOC, тогда Вам в пакетные файлы путь заказан по большому счёту. Можно использовать WSH или PowerShell. Что Вы дальше с полученными переменными окружения делаете, подставляете параметрами в какую-нибудь утилиту для обработки?
|
Отправлено: 00:30, 07-04-2018 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Навскидку:
WSH
Option Explicit Dim objFSO Dim strPath2Script Dim objFile Dim objDictionary Dim i Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") strPath2Script = objFSO.GetParentFolderName(WScript.ScriptFullName) With WScript.CreateObject("Scripting.Dictionary") i = 0 For Each objFile In objFSO.GetFolder(strPath2Script).Files If StrComp(objFSO.GetExtensionName(objFile.Name), "mxf", vbTextCompare) = 0 Then .Add i, objFile i = i + 1 End If Next If .Count = 2 Then If .Item(0).Size < .Item(1).Size Then WScript.Echo "Bigger file [" & .Item(1).Name & "]" WScript.Echo "Smaller file [" & .Item(0).Name & "]" Else WScript.Echo "Bigger file [" & .Item(0).Name & "]" WScript.Echo "Smaller file [" & .Item(1).Name & "]" End If Else WScript.Echo "Need exactly two files [*.mxf] in directory [" & strPath2Script & "]." WScript.Quit 1 End If End With Set objFSO = Nothing WScript.Quit 0 PoSH
$cFiles = Get-ChildItem -Path "$PSScriptRoot\*.mxf" -File if(@($cFiles).Count -eq 2) { if(@($cFiles)[0].Length -lt @($cFiles)[1].Length) { Write-Host "Bigger file [$(@($cFiles)[1].Name)]" Write-Host "Smaller file [$(@($cFiles)[0].Name)]" } else { Write-Host "Bigger file [$(@($cFiles)[0].Name)]" Write-Host "Smaller file [$(@($cFiles)[1].Name)]" } } else { Write-Host "Need exactly two files [*.mxf] in directory [$PSScriptRoot]." } |
|
Отправлено: 00:57, 07-04-2018 | #5 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 01:00, 07-04-2018 | #6 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Как я понимаю, если такое возможно, то в скрипте PoSH надо будет еще две дополнительные переменные (BigFile и SmallFile), которые в себя запишут информацию о названии файлов, а потом с этих переменных надо передать информацию в переменные bat-файла. |
|
Отправлено: 01:32, 07-04-2018 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата NeroDOC:
WSH
Option Explicit Dim objFSO Dim strPath2Script Dim objFile Dim objDictionary Dim i Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") strPath2Script = objFSO.GetParentFolderName(WScript.ScriptFullName) With WScript.CreateObject("Scripting.Dictionary") i = 0 For Each objFile In objFSO.GetFolder(strPath2Script).Files If StrComp(objFSO.GetExtensionName(objFile.Name), "mxf", vbTextCompare) = 0 Then .Add i, objFile i = i + 1 End If Next If .Count = 2 Then If .Item(0).Size < .Item(1).Size Then 'WScript.Echo "Bigger file [" & .Item(1).Name & "]" 'WScript.Echo "Smaller file [" & .Item(0).Name & "]" WScript.CreateObject("WScript.Shell").Run """Path\bla-bla-bla.exe"" -param1 -param2 -param3 -fileBigger """ & .Item(1).Name & """ -fileSmaller """ & .Item(0).Name & """", 1, True Else 'WScript.Echo "Bigger file [" & .Item(0).Name & "]" 'WScript.Echo "Smaller file [" & .Item(1).Name & "]" WScript.CreateObject("WScript.Shell").Run """Path\bla-bla-bla.exe"" -param1 -param2 -param3 -fileBigger """ & .Item(0).Name & """ -fileSmaller """ & .Item(1).Name & """", 1, True End If Else WScript.Echo "Need exactly two files [*.mxf] in directory [" & strPath2Script & "]." WScript.Quit 1 End If End With Set objFSO = Nothing WScript.Quit 0 PoSH
$cFiles = Get-ChildItem -Path "$PSScriptRoot\*.mxf" -File if(@($cFiles).Count -eq 2) { if(@($cFiles)[0].Length -lt @($cFiles)[1].Length) { #Write-Host "Bigger file [$(@($cFiles)[1].Name)]" #Write-Host "Smaller file [$(@($cFiles)[0].Name)]" Start-Process -FilePath "Path\bla-bla-bla.exe" -ArgumentList "-param1 -param2 -param3 -fileBigger `"$(@($cFiles)[1].Name)`" -fileSmaller `"$(@($cFiles)[0].Name)`"" } else { #Write-Host "Bigger file [$(@($cFiles)[0].Name)]" #Write-Host "Smaller file [$(@($cFiles)[1].Name)]" Start-Process -FilePath "Path\bla-bla-bla.exe" -ArgumentList "-param1 -param2 -param3 -fileBigger `"$(@($cFiles)[0].Name)`" -fileSmaller `"$(@($cFiles)[1].Name)`"" } } else { Write-Host "Need exactly two files [*.mxf] in directory [$PSScriptRoot]." } Цитата NeroDOC:
Цитата NeroDOC:
2. Область переменных окружения у дочернего процесса интерпретатора команд PowerShell будет своя собственная и никак не пересекающаяся с областью переменных окружения родительского процесса интерпретатора команд cmd.exe. |
|||
Отправлено: 01:41, 07-04-2018 | #8 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Есть утилита, которая работает при отправке ей определенных параметров.
Есть бат-файл, который используется как интерактивное меню для указания нужных параметров (с предустановленными параметрами по умолчанию). Если использовать скрипт PoSH, то придется всё бат-меню переписывать под него. Поэтому, как по мне, было бы проще интегрировать исполнение данного кода в батник, чем переписывать весь батник под повершел. P.S. Предупреждение "Invalid number. Numbers are limited to 32-bits of precision." чем-то грозит в работе кода в батнике? |
Отправлено: 01:55, 07-04-2018 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата NeroDOC:
$aMenuItems = @( [System.Management.Automation.Host.ChoiceDescription]::new("&Первый", "Подсказка по первому пункту меню"), [System.Management.Automation.Host.ChoiceDescription]::new("&Второй", "Подсказка по второму пункту меню"), [System.Management.Automation.Host.ChoiceDescription]::new("&Третий", "Подсказка по третьему пункту меню") [System.Management.Automation.Host.ChoiceDescription]::new("В&ыход", "Выход из меню") ) while($true) { switch($host.UI.PromptForChoice("Моё меню", "Выберете одно из:", $aMenuItems, 3)) { 0 { Write-Host "Выбран первый пункт меню" -ForegroundColor Yellow; break } 1 { Write-Host "Выбран второй пункт меню" -ForegroundColor Yellow; break } 2 { Write-Host "Выбран третий пункт меню" -ForegroundColor Yellow; break } 3 { Write-Host "Выбран выход из меню" -ForegroundColor Green; break while } } } Цитата NeroDOC:
Цитата:
|
|||
Отправлено: 03:03, 07-04-2018 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Как удалять файлы по размеру из командного файла? | njg | Скриптовые языки администрирования Windows | 8 | 28-08-2017 17:33 | |
CMD/BAT - [решено] Создание TXT файла для каждого файла в каталоге ISO и заполнение его по шаблону | onemal | Скриптовые языки администрирования Windows | 23 | 13-05-2017 15:35 | |
CMD/BAT - [решено] Создание резервной копии по размеру файла | Атриарх | Скриптовые языки администрирования Windows | 2 | 21-09-2016 16:42 | |
CMD/BAT - if в батнике по размеру файла больше 4 гигабайт | R.i.m.s.k.y. | Скриптовые языки администрирования Windows | 12 | 31-12-2013 18:30 | |
как найти окно по его размеру? | Baldr_log | AutoIt | 3 | 26-08-2009 14:49 |
|