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

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

本帖最后由 5i365 于 2021-12-26 19:20 编辑

非常想知道CMD和Powershell实现如下效果的代码, 哪个更容易理解一些, 个人感觉批处理用正则实现起来代码会少很多,但是会感觉不稳,期待高手能出招,感谢!

例如:
我有一个批处理文件 a.bat 它所在的完整路径如下:

C:\Users\Administrator\Desktop\54 阿YueYue、戾格、小田音乐社 - 沈园外\a.bat

想实现双击a.bat后, 能回显:

1.它所在的文件夹名 %wjj%   即  54 阿YueYue、戾格、小田音乐社 - 沈园外        【注:54是序号,后面有个空格,阿YueYue、戾格、小田音乐社  是歌手,后面有个空格-空格,沈园外是歌曲】

2.文件夹名的三个部分分别进行回显:
A.序号  %xh%  即 54
B.歌手  %gs%  即 阿YueYue、戾格、小田音乐社
C.歌曲  %gq%  即 沈园外

3.父文件夹名 %fwjj%  即 Desktop

回复 28# qixiaobin0715


    哦, 上面我表达错了, 应该是可以用不这句了 &setlocal enabledelayedexpansion
这好像是延迟扩展吧, 一直对这个不理解

TOP

像这些就是循环变量的增强用法:
%~I
%~nI
%~nxI
%~dpI
....

TOP

回复 26# qixiaobin0715


    感谢解释, 还是有点不太懂, 用下面这个代码, 不用增强变量什么的, 直接就取到了文件夹名,比较好理解
for %%a in ("%~f0\..") do (set wjj=%%~nxa)

TOP

循环变量增强中,都会变量值中把最后一个点号默认为是扩展名的分界。%%~ni意思是只匹配文件名,会把最后一个点号以及后面的字符当成扩展名而忽略掉。

TOP

回复 24# qixiaobin0715


    问题在哪里? 我看好像只改了一个字母
%%~nxi

TOP

回复 15# 5i365
代码已修改。

TOP

回复 22# Nsqs


    能帮看一下这个吗? 受上面的启发胡乱写的  ,多谢
http://www.bathome.net/redirect. ... 1237&pid=250120

TOP

回复 21# 5i365


    当然可以,自己试试就知道了,正则万能

TOP

回复 20# Nsqs


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

第一部分总是数字
第二部分可能是数字字母符号空格的组合
第三部分也可能是数字字母符号空格的组合

TOP

本帖最后由 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

评分人数

    • 5i365: 很好的示例,多谢技术 + 1

TOP

问题解决了:
for %%a in ("%~f0\..") do (set wjj=%%~nxa)

TOP

下面这个办法稳,但是怎样用到批处理中?
(split-path $MyInvocation.MyCommand.definition).split("\")[-1]

TOP

回复 5# qixiaobin0715


    %~dp0.  和%CD%  的方法,在上面的文件夹名测试 不稳

TOP

回复 13# for_flr


    您好,请问怎样在批处理中使用上面的powershell中的变量值呢, 批处理有点不稳,有时获取的值是错误的

TOP

返回列表