缘由:要批量处理ncm文件,cmd的for好难记,不小心打开了ps
首先,我们要打开powershell。在键盘上按下Windows+X组合键,就可以看见Windows Powershell选项了。点击它。
但我不是这样干的,Windows Terminal比 ps 的原生界面漂亮多了。


首先,我们要获取文件列表。经过bing一下后,发现需要用到名为 Get-ChildItem
的cmdlet。那么,我们来man一下他,看看他怎么用。
PS C:\Users\DT9025A>man Get-ChildItem
名称Get-ChildItem
语法Get-ChildItem [[-Path] <string>]] [[-Filter] <string>]] [<CommonParameters>] Get-ChildItem [[-Filter] <string>] [<CommonParameters>]
别名gci ls dir
就很清楚,为了测验,我们先用 Get-ChildItem [[-Path] <string>] [[-Filter] <string>]
模式来试一下能否正常获取文件列表。
# 获取文件集合 Get-ChildItem D:\CloudMusic *.mp3

感觉很棒!那么接下来我们就可以进行遍历测试了!
继续使用万能的bing,了解到PowerShell中有foreach关键字,用法就像C#内的foreach一样 foreach([Var] in [Set])
。 (cmdlet和别名混用,别学我)这样,就来测试一下自己的举一反三力吧。
# 测试foreach # 获取文件集合 $files = Get-ChildItem D:\CloudMusic *.mp3 # 计数变量 $count = 0 # 遍历集合 foreach ($singleFile in $files) { # 输出计数和文件名 echo $count $singleFile.Name $count++ }

很棒,这样foreach就可以用了。看起来离成功已经很近了呢。
继续万能的bing,查到了运行程序可以用 Start-Process
进行。PowerShell给出的man信息如下:
PS C:\Users\DT9025A>man Start-Process
名称Start-Process
语法Start-Process [-FilePath] <string> [[-ArgumentList] <string>] [<CommonParameters>] Start-Process [-FilePath] <string> [[-ArgumentList] <string[]>] [<CommonParameters>]
别名saps start
于是理所当然的写出了下列代码:
# 测试运行 # 获取文件集合 $files = Get-ChildItem D:\CloudMusic *.ncm # 定义可执行文件路径 $exeDir = "D:\...\main.exe" # 遍历集合 foreach ($singleFile in $files) { # 执行程序 Start-Process -FilePath $exeDir -ArgumentList $singleFile.FullName -NoNewWindow -Wait }
但是,问题他出现了!目标程序提示无效的路径!
此时,往上翻翻,发现文件名中间有空格… 这样的话,就需要在绝对路径前后加上引号来指示这是单个参数了。那么,就去查查字符串如何拼接吧!
结果震撼我整年,竟然可以用 “+” 直接进行连接,PowerShell真是太厉害啦!
除了 “+” 操作符,还可以使用 -Join(string1, string2...)
进行连接。
# 测试字符串连接 # 定义两个字符串 $s = "te" $s2 = "st" # 使用 + 操作符 $s + $s2 # 使用 -Join(...) -Join($s, $s2)

感觉很棒!那么,引号怎么表示呢?
答:”””” 在字符串内两个双引号可以转义为单个双引号。
# 测试引号 # 定义字符串 $s = """te""" # 输出字符串 $s

让我们把这些元素合到一起!
# 测试运行 # 获取文件集合 $files = Get-ChildItem D:\CloudMusic *.ncm # 定义可执行文件路径 $exeDir = "D:\...\main.exe" # 遍历集合 foreach ($singleFile in $files) { # 拼接合法路径 $fileDir = -Join("""", $singleFile.FullName, """") # 执行程序 Start-Process -FilePath $exeDir -ArgumentList $fileDir -NoNewWindow -Wait }