Компьютерный форум 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=334187)

NeroDOC 06-04-2018 22:37 2807503

Выбор файла по его размеру
 
Здравствуйте, уважаемые знатоки!

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

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

С уважанием.

Iska 06-04-2018 23:34 2807507

Например, так:
Скрытый текст
Код:

@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


NeroDOC 06-04-2018 23:45 2807508

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

Iska 07-04-2018 00:30 2807510

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

Iska 07-04-2018 00:57 2807512

Навскидку:
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]."
}


NeroDOC 07-04-2018 01:00 2807514

Цитата:

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

Да, всё верно.

NeroDOC 07-04-2018 01:32 2807515

Цитата:

Цитата Iska
PoSH »

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

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

Iska 07-04-2018 01:41 2807516

Цитата:

Цитата 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.

NeroDOC 07-04-2018 01:55 2807519

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

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

Iska 07-04-2018 03:03 2807520

Цитата:

Цитата 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.
?


Время: 23:03.

Время: 23:03.
© OSzone.net 2001-