找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 627|回复: 4

[文件操作] 【求助】BAT运行没有效果,在CMD情况运行OK

[复制链接]
发表于 2026-2-10 12:37:43 | 显示全部楼层 |阅读模式
【需求背景】
在 Windows 环境下,需要从多个源目录中,只复制“修改时间排第二新”的文件到目标目录。
目前的问题是:在CMD窗口可以运行, 当是作成bat之后运行没有效果。

处理逻辑:
- 按文件的“最后修改时间”排序(倒序)
- 只选取“第二新”的那个文件
- 复制该文件到目标目录
powershell -NoProfile -Command "$src=@('D:\DataCollect\data\【M001】','D:\DataCollect\data\【M002】','D:\DataCollect\data\【M003】','D:\DataCollect\data\【M004】','D:\DataCollect\data\【M005】','D:\DataCollect\data\【M006】','D:\DataCollect\data\【M007】','D:\DataCollect\data\【M008】','D:\DataCollect\data\【M009】','D:\DataCollect\data\【M010】','D:\DataCollect\data\【M011】','D:\DataCollect\data\【M012】','D:\DataCollect\data\【M013】','D:\DataCollect\data\【M014】','D:\DataCollect\data\【M015】','D:\DataCollect\data\【M016】','D:\DataCollect\data\【M017】','D:\DataCollect\data\【M018】','D:\DataCollect\data\【M019】','D:\DataCollect\data\【M020】'); foreach($s in $src){ Get-ChildItem $s -Filter *.csv -File | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination 'X:\' -Force }"
 楼主| 发表于 2026-2-10 14:15:48 | 显示全部楼层
让AI帮忙修改后,可以了。
也不明白是社么原因
@echo off
chcp 65001 >nul
:: 封装你逐行的代码,仅改目标路径为X:\调试,换行用;连接
powershell -NoProfile -Command "Get-ChildItem D:\DataCollect\data\【M001】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M002】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M003】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M004】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M005】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M006】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M007】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M008】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M009】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M010】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M011】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M012】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M013】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M014】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M015】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M016】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M017】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M018】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M019】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force; Get-ChildItem D:\DataCollect\data\【M020】 -Filter *.csv | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 -First 1 | Copy-Item -Destination X:\调试 -Force"
echo 复制执行完成!
pause >nul
 楼主| 发表于 2026-2-10 14:18:09 | 显示全部楼层
总结
编码修复:添加chcp 65001解决中文 / 特殊符号(如【】)的路径解析错误,这是 bat 执行无效的核心原因之一;
逻辑改写:去掉 PowerShell 的数组和 foreach 循环,改为逐个路径独立执行,避开 bat 对复杂 PowerShell 脚本的解析冲突;
体验优化:添加回显关闭、执行提示和窗口暂停,让脚本更易使用和排查问题。
发表于 2026-2-10 14:34:38 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-2-10 14:46 编辑

回复 1# adfs945

载入批处理脚本文件运行无效是因 cmd 窗口当前码页默认采用简中编码字符集=936,而存为文件的默认编码可能是 utf-8,如是,运行脚本时须先切换当前码页为 65001 方可... 另给一个简化的 bat+powershell 版本如下,用简中编码(ansi 或 gb2312)存为 test.bat 运行...

  1. @echo off & powershell -nop -c "1..20|%%{ $d='D:\DataCollect\data\【m'+$_.toString('000')+'】';dir $d -Filter *.csv -File | Sort LastWriteTime -Descending | Select -Skip 1 -First 1 | Copy -Destination 'x:\' -Force }" &pause&exit/b
复制代码
如脚本文件仍用 utf-8 编码存盘,则须改用如下代码

  1. @echo off & chcp 65001>nul
  2. powershell -nop -c "1..20|%%{ $d='D:\DataCollect\data\【m'+$_.toString('000')+'】';dir $d -Filter *.csv -File | Sort LastWriteTime -Descending | Select -Skip 1 -First 1 | Copy -Destination 'x:\' -Force }" &pause&exit/b
复制代码
 楼主| 发表于 2026-2-12 16:26:57 | 显示全部楼层
回复 4# aloha20200628


    感谢大神指导。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:46 , Processed in 0.018075 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表