我正在尝试将 2 个 powershell 命令放入 .bat 文件中,这样我只需单击该文件并运行它们,而无需打开 powershell、粘贴命令等。命令如下:
cd Downloads
get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }
我目前有一个 .bat 文件powershell -ExecutionPolicy Bypass -Command 'cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }'
,但它不起作用。我还尝试过:
powershell -Command 'cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }'
powershell -command 'cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }'
powershell -Command "cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }"
powershell -command "cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }"
powershell -ExecutionPolicy Bypass -Command "cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }"
如何在 .bat 文件或类似文件中使用 powershell 命令?
答案1
问题是有时很奇怪的 Windows 函数“CommandLineToArgvW”,它是 powershell exe 的所有参数都将与之关联的函数。
powershell -Command 'cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-", "") }'
最终将
Param 000: powershell
Param 001: -Command
Param 002: 'cd
Param 003: Downloads;
Param 004: get-childitem
Param 005: *.mp4
Param 006: |
Param 007: foreach
Param 008: {
Param 009: rename-item
Param 010: $_
Param 011: $_.Name.Replace(yt5s.com-,
Param 012: )
Param 013: }'
您请求的用例的一个正确转义是
powershell -Command "cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace(""yt5s.com-\",\"\")}"
这将导致:
Param 000: powershell
Param 001: -Command
Param 002: cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace("yt5s.com-","")}
但对于此类构造,我会坚持以下规则。
使用“作为命令字符串,在命令字符串内使用'
这样一来,也有效。
powershell -Command "cd Downloads; get-childitem *.mp4 | foreach { rename-item $_ $_.Name.Replace('yt5s.com-','')}"
我已经构建并发布了一个应用程序(快速而粗糙)供您测试
存储库中的行为,如果您无法编译代码,请查看 bin debug。
它是一个 .net 2.0 exe,因此它应该可以在几乎每台 Windows PC 上运行。
答案2
您可以在 cmd 或者 bat 文件中尝试:
>powershell -nop -c "gci $HOME\Downloads\*yt5s.com-*.mp4 | ? {ren $_ $_.Name.Replace('yt5s.com-','')}"
# or
>powershell -nop -c "gci $HOME\Downloads\*yt5s.com-*.mp4 | ? {ren $_ -N $_.Name.Replace('yt5s.com-','')}"
# or
>powershell -nop -c "Get-ChildItem $HOME\Downloads\*yt5s.com-*.mp4 | foreach { rename-item $_ -New $_.Name.Replace('yt5s.com-','')}"
# or
>powershell -nop -c "Get-ChildItem $HOME\Downloads\*yt5s.com-*.mp4 | foreach { rename-item $_ -NewName $_.Name.Replace('yt5s.com-','')}"
也许你知道-Whatif | -wi
选项,但我会向那些不想这样做的人建议:
- 使用
-Whatif | -wi
测试你的命令而不采取任何行动,只指示将要进行的更改
>powershell -nop -c "gci $HOME\Downloads\*yt5s.com-*.mp4 | ? { ren $_ $_.Name.Replace('yt5s.com-','') -wi }"
# Or
>powershell -nop -c "Get-ChildItem $HOME\Downloads\*yt5s.com-*.mp4 | foreach { rename-item $_ -NewName $_.Name.Replace('yt5s.com-','') -Whatif }"
# results:
What if: Performing the operation "Rename File" on target "Item: C:\Users\ecker\Downloads\Name Test yt5s.com- 0001.mp4 Destination: C:\Users\ecker\Downloads\Name Test 0001.mp4".
What if: Performing the operation "Rename File" on target "Item: C:\Users\ecker\Downloads\Name yt5s.com- Test 0002.mp4 Destination: C:\Users\ecker\Downloads\Name Test 0002.mp4".
What if: Performing the operation "Rename File" on target "Item: C:\Users\ecker\Downloads\yt5s.com-Name- Test_0004.mp4 Destination: C:\Users\ecker\Downloads\Name- Test_0004.mp4".
- 在 cmd 提示符中:
>for %i in ("%homepath%\Downloads\*yt5s.com-*.mp4")do set "_file=%~nxi" & cmd.exe /v/e/c ren "%~fi" "!_file:yt5s.com-=!"
- 在 cmd/bat 文件中:
@echo off
for %%i in ("%homepath%\Downloads\*yt5s.com-*.mp4"
)do set "_file=%%~nxi" & cmd.exe /v/e/c ren "%%~fi" "!_file:yt5s.com-=!"
进一步阅读 bat/cmd:
PowerShell 的一些进一步阅读内容: