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

[文件操作] 获取批处理所在的文件夹名及名字中的各个部分,和文件夹的父文件夹名

[复制链接]
 楼主| 发表于 2022-1-6 22:50:06 | 显示全部楼层
回复 13# for_flr


    您好,请问怎样在批处理中使用上面的powershell中的变量值呢, 批处理有点不稳,有时获取的值是错误的
 楼主| 发表于 2022-1-6 23:24:41 | 显示全部楼层
回复 5# qixiaobin0715


    %~dp0.  和%CD%  的方法,在上面的文件夹名测试 不稳
 楼主| 发表于 2022-1-6 23:35:06 | 显示全部楼层
下面这个办法稳,但是怎样用到批处理中?
(split-path $MyInvocation.MyCommand.definition).split("\")[-1]
 楼主| 发表于 2022-1-7 00:01:43 | 显示全部楼层
问题解决了:
for %%a in ("%~f0\..") do (set wjj=%%~nxa)
发表于 2022-1-7 07:47:57 | 显示全部楼层
本帖最后由 Nsqs 于 2022-1-7 07:53 编辑

方法1[bat]:
  1. @echo off
  2. for /f "delims=" %%1 in ('powershell "(dir ..  -Dir).name -match '(\d+) *(.+) *- *(.+)'|Out-Null;$matches[1],$matches[2],$matches[3]"')do (
  3.         set /a n+=1
  4.         call set #_%%n%%=%%1
  5. )
  6. set number=%#_1%
  7. set song=%#_2%
  8. set singer=%#_3%
  9. echo 编号: %number%
  10. echo 歌曲: %song%
  11. echo 歌手: %singer%
  12. pause
复制代码
方法2[bat]:
  1. @echo off
  2. for /f "delims=| tokens=1,2,3" %%1 in ('powershell "(dir ..  -Dir).name -match '(\d+) *(.+) *- *(.+)'|Out-Null;$m=$matches[1],$matches[2],$matches[3];$m[0]+'|'+$m[1]+'|'+$m[2]"')do (
  3. set number=%%1
  4. set song=%%2
  5. set singer=%%3
  6. )
  7. echo 编号: %number%
  8. echo 歌曲: %song%
  9. echo 歌手: %singer%
  10. pause
复制代码
方法3[ps]:
  1. (dir ..  -Dir).name -match '(\d+) *(.+) *- *(.+)'|Out-Null
  2. $number=$Matches[1]
  3. $song=$Matches[2]
  4. $singer=$Matches[3]
  5. @"
  6. 编号: $number
  7. 歌曲: $song
  8. 歌手: $singer
  9. "@
  10. [System.Console]::ReadKey(0)
复制代码
另外如果歌曲名有多级-或者空格的话,楼上所有bat代码均有多多少少的问题,想解决此问题,酌情考虑自己自身需求和实际代码需求,如果所有的歌曲名仅是简单组合,那么就不会有任何问题
否则就不要用纯bat解决问题

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 很好的示例,多谢

查看全部评分

 楼主| 发表于 2022-1-7 07:58:29 | 显示全部楼层
回复 20# Nsqs


    方法3用正则能适应各种情况吗?

第一部分总是数字
第二部分可能是数字字母符号空格的组合
第三部分也可能是数字字母符号空格的组合
发表于 2022-1-7 08:05:22 | 显示全部楼层
回复 21# 5i365


    当然可以,自己试试就知道了,正则万能
 楼主| 发表于 2022-1-7 08:09:08 | 显示全部楼层
回复 22# Nsqs


    能帮看一下这个吗? 受上面的启发胡乱写的  ,多谢
http://www.bathome.net/redirect. ... 1237&pid=250120
发表于 2022-1-7 11:03:59 | 显示全部楼层
回复 15# 5i365
代码已修改。
 楼主| 发表于 2022-1-7 12:14:32 | 显示全部楼层
回复 24# qixiaobin0715


    问题在哪里? 我看好像只改了一个字母
%%~nxi
发表于 2022-1-7 12:21:12 | 显示全部楼层
循环变量增强中,都会变量值中把最后一个点号默认为是扩展名的分界。%%~ni意思是只匹配文件名,会把最后一个点号以及后面的字符当成扩展名而忽略掉。
 楼主| 发表于 2022-1-7 12:23:55 | 显示全部楼层
回复 26# qixiaobin0715


    感谢解释, 还是有点不太懂, 用下面这个代码, 不用增强变量什么的, 直接就取到了文件夹名,比较好理解
for %%a in ("%~f0\..") do (set wjj=%%~nxa)
发表于 2022-1-7 12:42:39 | 显示全部楼层
像这些就是循环变量的增强用法:
%~I
%~nI
%~nxI
%~dpI
....
 楼主| 发表于 2022-1-7 13:13:40 | 显示全部楼层
回复 28# qixiaobin0715


    哦, 上面我表达错了, 应该是可以用不这句了 &setlocal enabledelayedexpansion
这好像是延迟扩展吧, 一直对这个不理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 17:23 , Processed in 0.026138 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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