Board logo

标题: [文件操作] 获取批处理所在的文件夹名及名字中的各个部分,和文件夹的父文件夹名 [打印本页]

作者: 5i365    时间: 2021-12-26 19:11     标题: 获取批处理所在的文件夹名及名字中的各个部分,和文件夹的父文件夹名

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

作者: netbenton    时间: 2021-12-26 19:55

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in ("%~p0") do (
  3. set var=%%~a
  4. for %%b in ("!var:~0,-1!") do (
  5. for /f "tokens=1,2,3 delims=- " %%1 in ("%%~nb") do (
  6. set _xh=%%1
  7. set _gs=%%2
  8. set _gq=%%3
  9. )
  10. )
  11. )
  12. set _
  13. pause
复制代码

作者: 5i365    时间: 2021-12-26 20:16

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

回复 2# netbenton


    感谢, 没用正则也取出了文件夹名字的三个部分, 但代码理解起来还是有些困难, 没有echo 却能回显, 太高端了
估计powershell会好理解一些

最后的 set _  是什么意思呢?
作者: qixiaobin0715    时间: 2021-12-26 20:27

本帖最后由 qixiaobin0715 于 2022-1-7 11:03 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in ("%~dp0.") do (
  4.     set Folder1=%%~nxi
  5.     echo,!Folder1!
  6.     for /f "tokens=1-2* delims=- " %%a in ("!Folder1!") do (
  7.         set xh=%%a
  8.         set gq=%%b
  9.         set gs=%%c
  10.         echo,!xh!
  11.         echo,!gq!
  12.         echo,!gs!
  13.     )
  14. )
  15. for %%k in ("%~dp0..") do (
  16.     set Folder2=%%~nxk
  17.     echo,!Folder2!
  18. )
  19. pause
复制代码

作者: qixiaobin0715    时间: 2021-12-26 20:43

set _:显示所有变量名以_开头的变量。
作者: 5i365    时间: 2021-12-26 20:50

回复 4# qixiaobin0715

感谢出招,所有路径部分都显示了,
下面两行的意思,貌似是: 一个.表示所在文件夹, 两个.表示父文件夹, 真没想到还能这样用,
代码相对好理解一些, 但还是没有用正则

%~dp0.

%~dp0..
作者: 5i365    时间: 2021-12-26 20:57

回复 4# qixiaobin0715


  你好, 文件夹名的三个部分是用for输出的, 怎样赋值到单独的变量 %xh%, %gq%, %gs%上呢? 因为后面要用, 脑子一时转不过玩儿来
作者: 5i365    时间: 2021-12-26 21:03

回复 4# qixiaobin0715


    直接回显 echo %~dp0. 又不是想要的结果, 难道 . 只是用作 转义 ?
作者: qixiaobin0715    时间: 2021-12-26 21:22

回复 7# 5i365
按2楼的方法即可,已修改。
作者: 5i365    时间: 2021-12-26 21:32

回复 9# qixiaobin0715


    为什么要改, 您以前的下面的方法, 不稳吗?

    set "str=%%~ni"
    set "str=!str:-=!"
    for %%j in (!str!) do echo,%%j
作者: 5i365    时间: 2021-12-26 21:35

回复 9# qixiaobin0715


    最后那个变量显示错误:

54 阿YueYue、戾格、小田音乐社 - 沈园外
54
阿YueYue、戾格、小田音乐社
沈园外
%~ni
请按任意键继续. . .
作者: qixiaobin0715    时间: 2021-12-26 21:40

回复 10# 5i365
使用for /f 单独赋值方便些。最后循环变量笔误,已修改。
作者: for_flr    时间: 2021-12-27 11:00

  1. $p=$MyInvocation.MyCommand.definition
  2. (split-path $p).split("\")[-1]
  3. (split-path $p).split("\")[-2]
  4. $id=@("序号","歌手","歌名")
  5. $delim=(split-path $p).split("\")[-1].split(" -",[System.StringSplitOptions]::RemoveEmptyEntries)
  6. for($n=0;$n -lt 3;$n++){write-host $id[$n]    $delim[$n]}
  7. $null=[console]::readkey()
复制代码
理解的话,怕是powershell容易一点,比较口语化
作者: qixiaobin0715    时间: 2021-12-27 11:11

谢谢。学习学习powershell
作者: 5i365    时间: 2022-1-6 22:45

本帖最后由 5i365 于 2022-1-6 22:54 编辑

回复 4# qixiaobin0715


    这个出错了, 如果批处理所在的文件夹的名字是    151 G.E.M.邓紫棋 - 光年之外     回显的值是错误的

151 G.E.M.邓紫棋 - 光年之外

绿色部分总是数字
红色部分可能是数字字母符号空格的组合
蓝色部分也可能是数字字母符号空格的组合,有更稳的办法吗? 感谢

回显的信息:
151
G.E.M
ECHO 处于关闭状态。
请按任意键继续. . .
-------------------------------------------------------------------------------
批处理代码;
@echo off&mode con cols=106 lines=13&setlocal enabledelayedexpansion

for %%i in ("%~dp0.") do (set wjj=%%~ni
    for /f "tokens=1-2* delims=- " %%a in ("!wjj!") do (
        set xh=%%a
        set gs=%%b
        set gq=%%c
    )
)
echo %xh%
echo %gs%
echo %gq%
pause
作者: 5i365    时间: 2022-1-6 22:50

回复 13# for_flr


    您好,请问怎样在批处理中使用上面的powershell中的变量值呢, 批处理有点不稳,有时获取的值是错误的
作者: 5i365    时间: 2022-1-6 23:24

回复 5# qixiaobin0715


    %~dp0.  和%CD%  的方法,在上面的文件夹名测试 不稳
作者: 5i365    时间: 2022-1-6 23:35

下面这个办法稳,但是怎样用到批处理中?
(split-path $MyInvocation.MyCommand.definition).split("\")[-1]
作者: 5i365    时间: 2022-1-7 00:01

问题解决了:
for %%a in ("%~f0\..") do (set wjj=%%~nxa)
作者: Nsqs    时间: 2022-1-7 07:47

本帖最后由 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解决问题
作者: 5i365    时间: 2022-1-7 07:58

回复 20# Nsqs


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

第一部分总是数字
第二部分可能是数字字母符号空格的组合
第三部分也可能是数字字母符号空格的组合
作者: Nsqs    时间: 2022-1-7 08:05

回复 21# 5i365


    当然可以,自己试试就知道了,正则万能
作者: 5i365    时间: 2022-1-7 08:09

回复 22# Nsqs


    能帮看一下这个吗? 受上面的启发胡乱写的  ,多谢
http://www.bathome.net/redirect. ... 1237&pid=250120
作者: qixiaobin0715    时间: 2022-1-7 11:03

回复 15# 5i365
代码已修改。
作者: 5i365    时间: 2022-1-7 12:14

回复 24# qixiaobin0715


    问题在哪里? 我看好像只改了一个字母
%%~nxi
作者: qixiaobin0715    时间: 2022-1-7 12:21

循环变量增强中,都会变量值中把最后一个点号默认为是扩展名的分界。%%~ni意思是只匹配文件名,会把最后一个点号以及后面的字符当成扩展名而忽略掉。
作者: 5i365    时间: 2022-1-7 12:23

回复 26# qixiaobin0715


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

像这些就是循环变量的增强用法:
%~I
%~nI
%~nxI
%~dpI
....
作者: 5i365    时间: 2022-1-7 13:13

回复 28# qixiaobin0715


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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2