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

CyberNoble 23-10-2019 16:43 2893234

Необходимо сделать два батника,подскажите ошибки
 
Нужно создать батник,который копирует все файлы в расширении .txt ,кроме одного ,который задан в параметре %2,в директорию ,заданную параметром %1
Сделал вот такой
Код:

@echo off
REM вывод каталога
FOR %%a IN (*.txt) DO IF NOT %%a == %2 COPY %%a %1

Но он копирует все файлы в формате txt,думаю,что проблема в 99% в том,что я не так использую IF в цикле.Нужно именно через цикл

И второе задание такое,что нужно написать пакетный файл, который автоматически удалял бы в каталоге, указанном в командной строке все файлы, размер которых превышает 2 Мбайт.
Была идея сделать через сортировку по размеру в dir ,а потом в find,но дир просто по порядку их делает,там нельзя сделать так,чтобы файлы не удовлетворяющие размеру не показывались,поэтому пока не выходит.У одногруппника идея была,что нгужно создать переменную с размером,и сравнивать с ней,но мы так и не знаем как сделат ьпо уму

P.S. Сделал первое,оказывается я тупой,нужно было писат ьв консоль не просто параметр имя файла,а имя с расширением

Iska 23-10-2019 19:03 2893260

Цитата:

Цитата CyberNoble
И второе задание такое… »

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1

if defined sSourceFolder (
        if exist "%sSourceFolder%" (
                set /a iMaxSize = 2 * 2^<^<20
               
                for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "%sSourceFolder%\*.*"`) do (
                        if %%~zi gtr !iMaxSize! echo del /f /q "%%~i"
                )
        ) else (
                echo Can't find source folder [%sSourceFolder%].
                exit /b 2
        )
) else (
        echo Usage: %~nx0 ^<Source folder^>
        exit /b 1
)

endlocal
exit /b 0

Для реального удаления уберите выделенное.

Vadikan 25-10-2019 10:27 2893513

2019 год, а все еще батникам в виндах учат :) Лучше б пошику учили.
"Батник"
Код:

powershell -noprofile -command "dir -Path c:\temp -File | where {$_.Length -gt 2097152} | %{del $_.FullName -WhatIf}"

YuS_2 25-10-2019 11:38 2893526

Цитата:

Цитата Vadikan
Лучше б пошику учили. »

Видимо, кто может - не хочет, а кто хочет - не знает...
Диалектика революции шелов, блин... ну, почти :)

Iska 25-10-2019 16:13 2893569

Цитата:

Цитата Vadikan
2019 год, а все еще батникам в виндах учат :) Лучше б пошику учили. »

Тут нужно желание вопрошающего учиться. Я вон регулярно советую, да толку-то…

Charg 25-10-2019 16:46 2893578

Цитата:

Цитата Iska
Тут нужно желание вопрошающего учиться. »

А тут разве кто-то из вопрошающих спрашивал "научите как сделать?". Ну, за редкими исключениями, конечно...
99% тем это "мне надо вот так, запилите чтоб я скопипастил и оно работало".

alpap 25-10-2019 17:09 2893581

на cmd тоже можно в одну строку:
Код:

@echo off
for /f "delims=" %%a in ('dir /a-d/b/s "%~1"') do for /f "tokens=3" %%b in ('dir /-c "%%a"^|findstr /rc:"^  .*"^|set /p #^=^^^& cmd /v/c echo:!#!') do if %%b gtr 2097152 >nul 2>&1 del "%%a"
pause


DJ Mogarych 25-10-2019 20:15 2893599

Задание первое:
Код:

$parameter1 = "C:\Users\User\Documents"
$parameter2 = "слово-для-исключения"
dir "C:\temp\*.txt" -Exclude "*$parameter2*" |Copy-Item -Destination "$parameter1"

Задание второе:
Код:

(dir "C:\temp").where{$_.Length -gt 2MB} |Remove-Item -Confirm:$false
Это всё Powershell.

Iska 25-10-2019 21:14 2893605

DJ Mogarych, вижу, что это:
Цитата:

Цитата DJ Mogarych
Код:

(dir "C:\temp").where{$_.Length -gt 2MB}
»

работает, но не пойму, как.
Код:

Get-ChildItem -Path "C:\temp"
возвращает один объект или массив объектов. Что такое «.where {…}»? Судя по точке, это должен быть метод или свойство, но чего именно? И фигурные скобки?! Не соображу.

alpap 25-10-2019 21:58 2893610

Цитата:

Цитата Iska
Что такое «.where {…}»? »

это сокращенно от Where-Object, насколько я понимаю.

DJ Mogarych 25-10-2019 22:29 2893611

Iska, про эту фишку я на прошлой неделе вычитал в книжке "PowerShell in Depth".
Where и foreach умеют быть методом, причём это работает быстрее, чем при передаче через пайп, как мы все привыкли. Сам не проверял быстродействие, но в книжке пользовались Measure-Command, разница в некоторых случаях в разы.

Правильнее, конечно, писать .where({}), но в данном случае можно и без круглых скобок.

Iska 25-10-2019 22:30 2893612

alpap, это-то я знаю. Но точка… Как это понимать? Откуда такой синтаксис вместо:
Код:

Get-ChildItem -Path "C:\temp" | Where-Object -FilterScript {$_.Length -gt 2MB}
Где об этом можно почитать?

DJ Mogarych, спасибо, ясно. Там были какие-то разъяснения, откуда сие взялось, и в каких случаях это «умеют» работает?

Ага. Нашёл:
Скрытый текст
Цитата:

7.5.3 The Where method

PowerShell v4 introduced another way to filter a collection of objects. This method
isn’t well documented, nor is it easily discoverable, yet it’s relatively easy to use and
performs well. Basically, you can use Where as a method:
Код:

(Get-Service m*).Where{$_.status -eq "stopped"}


и т.д.

DJ Mogarych 25-10-2019 22:43 2893615

Цитата из книжки:
Цитата:

В Powershell v4 появился новый способ фильтровать набор объектов. Этот способ как следует не задокументирован и его нелегко обнаружить, тем не менее, он относительно прост в использовании и хорошо работает.
Один из примеров:
Код:

(Get-Process | sort Handles).Where({$_.Handles -gt 1000}, "SkipUntil", 1)

Iska 25-10-2019 22:50 2893617

А вот и разница проклюнулась:
Скрытый текст
Код:

Get-ChildItem -Path "C:\Мои проекты\0282" | Where-Object -FilterScript {$_.Length -gt 2MB}
(Get-ChildItem -Path "C:\Мои проекты\0282" | Where-Object -FilterScript {$_.Length -gt 2MB}).GetType().FullName
''
 (Get-ChildItem -Path "C:\Мои проекты\0282").where({$_.Length -gt 2MB})
((Get-ChildItem -Path "C:\Мои проекты\0282").where({$_.Length -gt 2MB})).GetType().FullName

Цитата:

Код:


    Directory: C:\Мои проекты\0282


Mode                LastWriteTime        Length Name                                                                                                     
----                -------------        ------ ----                                                                                                     
-a----      13.03.2019    12:44        9722769 Sample 02.docx                                                                                           
-a----      13.03.2019    12:44        9722769 Sample.docx                                                                                               
System.Object[]

-a----      13.03.2019    12:44        9722769 Sample 02.docx                                                                                           
-a----      13.03.2019    12:44        9722769 Sample.docx                                                                                               
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKey
Token=31bf3856ad364e35]]




DJ Mogarych, да, спасибо, уже читаю. Плюс одна из первых ссылок выдачи (в открытом доступе): PowerShell V4: Where() and ForEach() Methods | Manning.

Iska 26-10-2019 01:38 2893633

Ну, и ещё до кучи: Introduction to the Where Method in PowerShell -- Microsoft Certified Professional Magazine Online.


Время: 04:35.

Время: 04:35.
© OSzone.net 2001-