标题: [文件操作] 获取批处理所在的文件夹名及名字中的各个部分,和文件夹的父文件夹名 [打印本页]
作者: 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
- @echo off&setlocal enabledelayedexpansion
- for %%a in ("%~p0") do (
- set var=%%~a
- for %%b in ("!var:~0,-1!") do (
- for /f "tokens=1,2,3 delims=- " %%1 in ("%%~nb") do (
- set _xh=%%1
- set _gs=%%2
- set _gq=%%3
- )
- )
-
- )
- set _
-
- 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 编辑
- @echo off
- setlocal enabledelayedexpansion
- for %%i in ("%~dp0.") do (
- set Folder1=%%~nxi
- echo,!Folder1!
- for /f "tokens=1-2* delims=- " %%a in ("!Folder1!") do (
- set xh=%%a
- set gq=%%b
- set gs=%%c
- echo,!xh!
- echo,!gq!
- echo,!gs!
- )
- )
- for %%k in ("%~dp0..") do (
- set Folder2=%%~nxk
- echo,!Folder2!
- )
- 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
- $p=$MyInvocation.MyCommand.definition
- (split-path $p).split("\")[-1]
- (split-path $p).split("\")[-2]
- $id=@("序号","歌手","歌名")
- $delim=(split-path $p).split("\")[-1].split(" -",[System.StringSplitOptions]::RemoveEmptyEntries)
- for($n=0;$n -lt 3;$n++){write-host $id[$n] $delim[$n]}
- $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]:- @echo off
- for /f "delims=" %%1 in ('powershell "(dir .. -Dir).name -match '(\d+) *(.+) *- *(.+)'|Out-Null;$matches[1],$matches[2],$matches[3]"')do (
- set /a n+=1
- call set #_%%n%%=%%1
- )
- set number=%#_1%
- set song=%#_2%
- set singer=%#_3%
- echo 编号: %number%
- echo 歌曲: %song%
- echo 歌手: %singer%
- pause
复制代码
方法2[bat]:- @echo off
- 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 (
- set number=%%1
- set song=%%2
- set singer=%%3
- )
- echo 编号: %number%
- echo 歌曲: %song%
- echo 歌手: %singer%
- pause
复制代码
方法3[ps]:- (dir .. -Dir).name -match '(\d+) *(.+) *- *(.+)'|Out-Null
- $number=$Matches[1]
- $song=$Matches[2]
- $singer=$Matches[3]
- @"
- 编号: $number
- 歌曲: $song
- 歌手: $singer
- "@
- [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 |