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

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

[复制链接]
发表于 2021-12-26 19:11:07 | 显示全部楼层 |阅读模式
本帖最后由 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
发表于 2021-12-26 19:55:31 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2021-12-26 20:16:42 | 显示全部楼层
本帖最后由 5i365 于 2021-12-26 20:21 编辑

回复 2# netbenton


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

最后的 set _  是什么意思呢?
发表于 2021-12-26 20:27:26 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 精炼!

查看全部评分

发表于 2021-12-26 20:43:07 | 显示全部楼层
set _:显示所有变量名以_开头的变量。
 楼主| 发表于 2021-12-26 20:50:42 | 显示全部楼层
回复 4# qixiaobin0715

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

%~dp0.

%~dp0..
 楼主| 发表于 2021-12-26 20:57:00 | 显示全部楼层
回复 4# qixiaobin0715


  你好, 文件夹名的三个部分是用for输出的, 怎样赋值到单独的变量 %xh%, %gq%, %gs%上呢? 因为后面要用, 脑子一时转不过玩儿来
 楼主| 发表于 2021-12-26 21:03:38 | 显示全部楼层
回复 4# qixiaobin0715


    直接回显 echo %~dp0. 又不是想要的结果, 难道 . 只是用作 转义 ?
发表于 2021-12-26 21:22:59 | 显示全部楼层
回复 7# 5i365
按2楼的方法即可,已修改。
 楼主| 发表于 2021-12-26 21:32:40 | 显示全部楼层
回复 9# qixiaobin0715


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

    set "str=%%~ni"
    set "str=!str:-=!"
    for %%j in (!str!) do echo,%%j
 楼主| 发表于 2021-12-26 21:35:45 | 显示全部楼层
回复 9# qixiaobin0715


    最后那个变量显示错误:

54 阿YueYue、戾格、小田音乐社 - 沈园外
54
阿YueYue、戾格、小田音乐社
沈园外
%~ni
请按任意键继续. . .
发表于 2021-12-26 21:40:45 | 显示全部楼层
回复 10# 5i365
使用for /f 单独赋值方便些。最后循环变量笔误,已修改。
发表于 2021-12-27 11:00:26 | 显示全部楼层
  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容易一点,比较口语化

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 牛X, 相对好理解些

查看全部评分

发表于 2021-12-27 11:11:53 | 显示全部楼层
谢谢。学习学习powershell
 楼主| 发表于 2022-1-6 22:45:33 | 显示全部楼层
本帖最后由 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 17:54 , Processed in 0.031584 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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