Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Выбор файла по его размеру

Ответить
Настройки темы
CMD/BAT - [решено] Выбор файла по его размеру

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте, уважаемые знатоки!

Возникла такая задача.
Есть каталог (к примеру Folder), где лежит наш батник. Кроме этого в данном каталоге есть приблизительно 10 других файлов с разными расширениями файлов (xml, mxf, cert)
В чем стоит задача:
1. Найти в этом каталоге файлы с определенным расширением, в данном случае .mxf (практика показывает, что их в папке всегда два).
2. Сравнить размеры этих файлов между собой.
3. Если размер файла А.mxf больше размера файла B.mxf - записать полное название файла A (с расширением) в переменную videofile, а название файла В в перемеренную audiofile. И наоборот, если файл В больше - в videofile, файл А в audiofile.

Заранее спасибо за помощь.

С уважанием.

Отправлено: 22:37, 06-04-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg search.jpg
(49.6 Kb, 5 просмотров)

Говорит, что большой файл аудио (хотя по размеру он меньше чем другой файл)

Отправлено: 23:45, 06-04-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


NeroDOC, тогда Вам в пакетные файлы путь заказан по большому счёту. Можно использовать WSH или PowerShell. Что Вы дальше с полученными переменными окружения делаете, подставляете параметрами в какую-нибудь утилиту для обработки?

Отправлено: 00:30, 07-04-2018 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
подставляете параметрами в какую-нибудь утилиту для обработки? »
Да, всё верно.

Отправлено: 01:00, 07-04-2018 | #6


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
PoSH »
А можно ли интегрировать выполнение данного кода в батник (не создавая файла скрипта script.ps1, с передачей данных с переменных PoSH -> Bat?

Как я понимаю, если такое возможно, то в скрипте PoSH надо будет еще две дополнительные переменные (BigFile и SmallFile), которые в себя запишут информацию о названии файлов, а потом с этих переменных надо передать информацию в переменные bat-файла.

Отправлено: 01:32, 07-04-2018 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить 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:
то в скрипте PoSH надо будет еще две дополнительные переменные (BigFile и SmallFile), которые в себя запишут информацию о названии файлов, а потом с этих переменных надо передать информацию в переменные bat-файла. »
1. Переменные в PowerShell — совсем другое, нежели переменные окружения.
2. Область переменных окружения у дочернего процесса интерпретатора команд PowerShell будет своя собственная и никак не пересекающаяся с областью переменных окружения родительского процесса интерпретатора команд cmd.exe.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:41, 07-04-2018 | #8


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Есть утилита, которая работает при отправке ей определенных параметров.
Есть бат-файл, который используется как интерактивное меню для указания нужных параметров (с предустановленными параметрами по умолчанию).
Если использовать скрипт PoSH, то придется всё бат-меню переписывать под него.
Поэтому, как по мне, было бы проще интегрировать исполнение данного кода в батник, чем переписывать весь батник под повершел.

P.S. Предупреждение "Invalid number. Numbers are limited to 32-bits of precision." чем-то грозит в работе кода в батнике?

Отправлено: 01:55, 07-04-2018 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата NeroDOC:
Если использовать скрипт PoSH, то придется всё бат-меню переписывать под него. »
Перепишите, бо каких-то особых выкрутасов с этим в PoSH не предвижу. Вот пример простого меню:
Код: Выделить весь код
$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:
P.S. Предупреждение "Invalid number. Numbers are limited to 32-bits of precision." чем-то грозит в работе кода в батнике? »
Не просто «грозит», а приводит к некорректной работе пакетного файла. Помните такое:
Цитата:

Потом уволил одного,
И стало их FF.
?
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:03, 07-04-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Выбор файла по его размеру

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход