bat 与 PowerShell 的结合使用

目录

  • 前言
  • 一、bat 做数字比较
  • 二、使用 PowerShell 比较
  • 三、其他调用 PowerShell 场景

前言

背景: 前前段时间,做文件操作处理时,有这么一个场景: window 下需要对某固定目录下的文件及其他文件进行拷贝操作, 至目标对象 外置存储设备(U盘或移动硬盘),且需要一定大小的存储量。
问题: 其主要问题不在文件拷贝操作,而是对外置存储设备的处理(主要是对磁盘大小的判断,也就是数字的比较)。首先批处理的数字有一定范围,其次超出范围的比较情况还有不同。
解决: 其一则是正面刚(截取操作再比较),其二则是绕过换其他方法(调 PowerShell 处理)

一、bat 做数字比较

注:范围值 正负 2^31-1
1.下图为批处理数字比较的情况:两个值都超出范围的比较,结果相反

2.以下为当时的脚本(后面磁盘大小的计算实在不知道咋怎,用了 PowerShell ):

@echo off & setlocal enabledelayedexpansion
rem =========================================================
rem ==  The tools develop for copy files to external disk  ==
rem ==          author: by zzw                             ==
rem ==          datetime: 2019.07.1                        ==
rem =========================================================

@rem chcp 936 ::更换默认编码

@rem 源路径
set srcPath=F:\zzwTest

@rem 本地磁盘驱动器: C:\ D:\ E::HasDrive
for /f "tokens=1,* delims= " %%i in ('fsutil fsinfo drives') do (
    set d=%%j
    set d=!d:\=!
    @rem echo !d!. 遍历磁盘信息是否包含 移动 字符
    for %%a in (!d!) do (
        fsutil fsinfo driveType %%a | findstr "移动" >nul && set driver=%%a
    )

    @rem 移动硬盘会被指定为固定驱动器.需要去除本地磁盘
    if not defined driver (
        set d=!d:C:=!
        set d=!d:D:=!
        set d=!d:E:=!
        set d=!d: =!
        set driver=!d!
        if "!d!"=="" ( call :Tip1 ) else ( call :Tip1 ZZW )
    )
    goto DriverSpace
)

:DriverSpace
if defined driver (
    @rem 包含 可用字节总数 的行,取第一行
    for /f "tokens=1,2 delims=:" %%i in ('fsutil volume diskFree %driver% ^|findstr "可用字节总数"') do (
        set free=%%j
        @rem echo !free! | findstr "(" && set free=!free:*(=! & set free=!free:^)=! || set free=!free: =!
        for /f "tokens=1 delims= " %%x in ("!free!") do (
            set free=%%x
        )
        @rem calculate disk size. multiplier of 1.1
        @rem debug: set free=1048576000
        if !free! LSS 1126 ( call :Tip3 1 B )
        if !free! LSS 1153433 ( call :Tip3 1024 KB )
        if !free! LSS 1181116006 ( call :Tip3 1024*1024 MB )
        call :Tip3 1024*1024*1024 GB

        :Below
        @rem 批处理数值范围在正负 2^31-1 = 2147483647
        set total=!free!t
        if "!total:~10!"=="" (
            @rem echo 小于 10 位数 0.93GB=999999999B  0.5GB=536870912B
            if "!total:~8!"=="" ( call :Tip2 [10MB] ★★★警告★★★)
            if "!total:~9!"=="" ( call :Tip2 [100MB] ★★★警告★★★)
            set totalN=!total:~0,9!
            if !totalN! LSS 104857600 ( call :Tip2 [100MB] ★★★警告★★★)
            if !totalN! LSS 262144000 ( call :Tip2 [250MB] ★★★警告★★★)
            if !totalN! LSS 536870910 ( call :Tip2 [500MB] ★★★警告★★★)
            call :Tip2 [1GB]
        )
        if "!total:~10!"=="t" (
            @rem echo 等于 10 位数 6GB=6442450944B
            set totalA=!total:~0,10!
            if !totalA! LSS 1048576000 ( call :Tip2 [1GB] )
            if !totalA! LSS 1610612735 ( call :Tip2 [1.5GB] )
            if !totalA! LSS 2147483646 ( call :Tip2 [2GB] )
            set totalB=!total:~0,9!
            if !totalB! LSS 268435456 ( call :Tip2 [2.5GB] )
            if !totalB! LSS 322122547 ( call :Tip2 [3GB] )
            if !totalB! LSS 429496729 ( call :Tip2 [4GB] )
            if !totalB! LSS 536870912 ( call :Tip2 [5GB] )
            if !totalB! LSS 644245094 ( call :Tip2 [6GB] )
        )
        goto ReSelect
    )
)

:Tip1
color 0b & echo,
echo    请确保外置 [U盘] 或 [移动硬盘] 插入成功!!!& echo,
if not "%1"=="" ( echo  磁盘识别错误,请联系开发者 ----^> %1& echo, )
goto End

:Tip2
color 0b & echo,
echo    请确保 %driver% 盘空间至少 6GB 可用 & echo,
if not "%2"=="" echo    %2
echo    注意 %driver% 盘空间小于 %1 ,不建议继续操作,默认 N
echo    若继续将可能导致部分文件复制失败!!!
echo,
set /p confirm=请确认是否要继续(N/Y)_^>^>
if /i %confirm%==y goto ReSelect
goto End

:Tip3
set /p =◆ %driver% 磁盘可用空间(约)为: <nul
@rem powershell -c "[String]$i=!free!/(%1);if($i.contains('.')) {$s=$i.split('.'); $s[0],$s[1].substring(0,3)+'%2' -join('.')} else {$i+'%2'}"
powershell -c "[String]$i=!free!/(%1);if($i.contains('.')) {$s=$i.split('.'); $s[0]+'.'+$s[1].substring(0,3)+' %2'} else {$i+'%2'}"
goto Below

:ReSelect
color 0a
echo,
echo *********该工具将拷贝所选目录文件至 %driver% 盘设备********
echo,
echo    请在下列选项中选择需要操作的路径(如: 1 、2 、3 )
echo,
echo ==========================================================
set a=0
for /f %%i in ('dir /b /ad "%srcPath%"') do (
    set /a a+=1
    echo    [!a!] %%i
)
echo,
echo ==========================================================
set a=0
set /p number=请输入:
for /f %%i in ('dir /b /ad "%srcPath%"') do (
    set /a a+=1
    if !a!==%number% set testResult=%%i & echo, & echo 你的选择是 %%i
)
if not defined testResult (
    color 04
    echo,
    echo 请选择正确的选项!
    echo 请按任意键重新选择!
    pause >nul & cls & goto ReSelect
)
echo,

echo "=====可以开始操作了======"

:End
pause

二、使用 PowerShell 比较

cmd 命令行中 powershell /? 先查看简要帮助文档
若要运行PowerShell 脚本或者命令,首先使用 PowerShell 需要开启相关权限,如下操作即可:

@echo off

@rem set the execution mode of the PowerShell
set flag=1
@rem -c ---> -Command
powershell -c "Get-ExecutionPolicy" |findstr "Restricted" >nul && set flag=0
if %flag% == 0 (
    powershell -c "Set-ExecutionPolicy RemoteSigned"
    echo Allowed to use powershell
)

:: 里面的冒号需要转义,才能正常输出
powershell -c "if(2147483648 -lt 2147483649){\"true\"}else{\"false\"}"

三、其他调用 PowerShell 场景

待续....

原文地址:https://www.cnblogs.com/zeo-to-one/p/11330156.html

时间: 2024-10-29 16:33:18

bat 与 PowerShell 的结合使用的相关文章

一次完整的从webshell到域控的探索之路

前言 内网渗透测试资料基本上都是很多大牛的文章告诉我们思路如何,但是对于我等小菜一直是云里雾里. 于是使用什么样的工具才内网才能畅通无阻,成了大家一直以来的渴求. 今天小菜我本着所有师傅们无私分享的精神,特将三年内求师傅,求妹子,求神器所得,经过整理后,关键的知识点写出来. 相关知识点总结如下: 免杀 payload 的生成,请使用 Veil msf 在 meterpreter 下的提权尝试 msf 在 meterpreter 下的 bypassuac 尝试 内网渗透测试过程中的信息关联 met

【AD】【组策略】利用启动脚本为域普通用户安装字体的方法

默认情况下安装字体需要管理员权限.如果只是把字体文件复制到%systemroot%\fonts内,是无法被系统认定为字体已经安装的.同时需要在以下位置的注册表写入一个项.hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts,具体格式你可以自己查看.那么知道怎么算正确安装脚本后.就可以使用启动脚本来做了.因为启动脚本用的是nt authority\system权限. 安装前字体文件夹内默认如下:注册表内如下: 脚本执行完安装后如下:注册表:

ECS运维神器重装上阵,云助手亮相控制台

摘要: 前段时间,我们的运维神器---阿里云云助手,已经通过OpenAPI的形式发布给广大用户.近来,我们根据广大用户的反馈,对其进行了优化,改进,增加了控制台的UI界面,使其变的更直观,更易用. 背景在使用ecs实例的过程中,为了处理一些问题,您不得不通过用户名,密码来直接登录机器.在这种情况下,如果你有成百上千台实例,你就会很难受的一台台去看.这是运维人士的一大痛点,基于此我们开发了全新的运维利器---云助手.您可以写一段shell, powershell或者bat命令,通过我们的云助手发送

TiOps脚本分发如何使用

在TiOps平台中,可以进行批量的脚本分发,分发的脚本支持手动创建的.脚本库里的.上传的脚本:登录TiOps平台,在左侧菜单中选择[运维管理]- [脚本分发]脚本分发具有以下特点 分发的脚本支持参数 执行脚本,可以安装agent也可以不安装agent,直接通过账号密码 支持手动创建的.脚本库里的.上传的脚本 支持的脚本语言包括shell,python,bat,powershell点击选择脚本,可以选择所有在脚本库中创建的脚本,点击添加选择脚本的版本,分发通道选SSH,并添加主机,选择完成,点击最

PowerShell实现自动化加域并加密凭据

困扰了一个礼拜的加域问题,今天终于给拿下,想分享下这个过程. 上个礼拜有User向领导抱怨他们的VM测试环境,需要不时的revert回去,需要重新加域.由于这边就只有我的账号有加域的权限,且我还不具备委派权限给其他账号来加域.很明显,如果我哪天休假,或者我不在office时候,User就应不了急.手动让我key密码的过程影响了user的工作效率,于是我想办法来解决这个问题. 方案一:将.bat脚本转换为.exe可执行文件 第一个方案是之前一个同事帮我想出来的,使用早期加域使用的netdom命令写

powershell 判断操作系统版本 命令

powershell 传教士 原创文章.始于 2015-12-15 允许转载,但必须保留名字和出处,否则追究法律责任 一 前言 判断操作系统版本,是个老话题,bat.vbs中都有例子,这本不是重要问题,我感脚不值得写帖.但是捏,随着win版本的增多,powershell版本碎片化越来越严重了,所以<用powershell判断操作系统版本>才越来越重要了.也就是说,使用稍微偏一点的powershell命令前,你必须判断操作系统版本.或者,强烈推荐大家用最新版本win服务器,win客户机玩powe

.bat文件设置IP、DNS

这几天遇到个烦心事,每次开机之后都要去手动去设置一下IP地址,一大串的数字还是有点麻烦,于是就想写个批处理文件设置IP 注意:在DOS下设置IP和DNS时需要管理员权限运行 1.查看机子设置IP需要用到的名字 名字是Ethernet 2.查看机子在DOS下设置IP和DNS命令的格式 C:\Windows\system32>netshnetsh>interfaceIn future versions of Windows, Microsoft might remove the Netsh fun

powershell玩转xml之20问

powershell 传教士 原创文章 2014-01-30,2015-10-16改 允许转载,但必须保留名字和出处,否则追究法律责任 问:xml文件编码情况如何?答:为了更好的支持多字符,xml文件都是utf8或unicode格式了,用bat处理不了了. 问:xml文件最基本的格式如何?答:<?xml version="1.0" encoding="UTF-16"?> <根节点><根节点/>如上所述,必须有,且只有一个根节点.并

利用Powershell快速对WPF的ListBox 数据源的绑定

有时候,我们在封闭的环境中做开发工作,并没有那么多便捷的开发工具,只能利用当前系统自带的基本工具做开发, 比如利用强大的framework,而powershell就是很好的开发工具,在不安装visual studio的情况下,就能实现大部分功能. 下面就用一个简单的例子来实现WPF中ListBox 数据源的绑定 1.关于dataset,我就不做多解释了,简单来说,就是一个或多个DataTable 对象的集合. 用powershell来实现的话,是简单不过的事情了. #Create Table o