Показать полную графическую версию : [решено] Выбор файла по его размеру
Здравствуйте, уважаемые знатоки!
Возникла такая задача.
Есть каталог (к примеру Folder), где лежит наш батник. Кроме этого в данном каталоге есть приблизительно 10 других файлов с разными расширениями файлов (xml, mxf, cert)
В чем стоит задача:
1. Найти в этом каталоге файлы с определенным расширением, в данном случае .mxf (практика показывает, что их в папке всегда два).
2. Сравнить размеры этих файлов между собой.
3. Если размер файла А.mxf больше размера файла B.mxf - записать полное название файла A (с расширением) в переменную videofile, а название файла В в перемеренную audiofile. И наоборот, если файл В больше - в videofile, файл А в audiofile.
Заранее спасибо за помощь.
С уважанием.
Например, так:
@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
Говорит, что большой файл аудио (хотя по размеру он меньше чем другой файл)
http://forum.oszone.net/attachment.php?attachmentid=152072&stc=1&d=1523047466
NeroDOC, тогда Вам в пакетные файлы путь заказан по большому счёту. Можно использовать WSH или PowerShell. Что Вы дальше с полученными переменными окружения делаете, подставляете параметрами в какую-нибудь утилиту для обработки?
Навскидку:
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
$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]."
}
подставляете параметрами в какую-нибудь утилиту для обработки? »
Да, всё верно.
PoSH »
А можно ли интегрировать выполнение данного кода в батник (не создавая файла скрипта script.ps1, с передачей данных с переменных PoSH -> Bat?
Как я понимаю, если такое возможно, то в скрипте PoSH надо будет еще две дополнительные переменные (BigFile и SmallFile), которые в себя запишут информацию о названии файлов, а потом с этих переменных надо передать информацию в переменные bat-файла.
Да, всё верно. »
Тогда примерно так (по понятной причине — не проверялось):
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
$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]."
}
А можно ли интегрировать выполнение данного кода в батник »
А зачем?! Не вижу смысла.
то в скрипте PoSH надо будет еще две дополнительные переменные (BigFile и SmallFile), которые в себя запишут информацию о названии файлов, а потом с этих переменных надо передать информацию в переменные bat-файла. »
1. Переменные в PowerShell — совсем другое, нежели переменные окружения.
2. Область переменных окружения у дочернего процесса интерпретатора команд PowerShell будет своя собственная и никак не пересекающаяся с областью переменных окружения родительского процесса интерпретатора команд cmd.exe.
Есть утилита, которая работает при отправке ей определенных параметров.
Есть бат-файл, который используется как интерактивное меню для указания нужных параметров (с предустановленными параметрами по умолчанию).
Если использовать скрипт PoSH, то придется всё бат-меню переписывать под него.
Поэтому, как по мне, было бы проще интегрировать исполнение данного кода в батник, чем переписывать весь батник под повершел.
P.S. Предупреждение "Invalid number. Numbers are limited to 32-bits of precision." чем-то грозит в работе кода в батнике?
Если использовать скрипт 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 }
}
}
P.S. Предупреждение "Invalid number. Numbers are limited to 32-bits of precision." чем-то грозит в работе кода в батнике? »
Не просто «грозит», а приводит к некорректной работе пакетного файла. Помните такое:
…
Потом уволил одного,
И стало их FF.
?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.