[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

  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
复制代码

TOP

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

回复 2# netbenton


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

最后的 set _  是什么意思呢?

TOP

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

评分人数

TOP

set _:显示所有变量名以_开头的变量。

TOP

回复 4# qixiaobin0715

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

%~dp0.

%~dp0..

TOP

回复 4# qixiaobin0715


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

TOP

回复 4# qixiaobin0715


    直接回显 echo %~dp0. 又不是想要的结果, 难道 . 只是用作 转义 ?

TOP

回复 7# 5i365
按2楼的方法即可,已修改。

TOP

回复 9# qixiaobin0715


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

    set "str=%%~ni"
    set "str=!str:-=!"
    for %%j in (!str!) do echo,%%j

TOP

回复 9# qixiaobin0715


    最后那个变量显示错误:

54 阿YueYue、戾格、小田音乐社 - 沈园外
54
阿YueYue、戾格、小田音乐社
沈园外
%~ni
请按任意键继续. . .

TOP

回复 10# 5i365
使用for /f 单独赋值方便些。最后循环变量笔误,已修改。

TOP

  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

评分人数

    • 5i365: 牛X, 相对好理解些技术 + 1

TOP

谢谢。学习学习powershell

TOP

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

TOP

返回列表