Powershell 命令未在 CMD 或 .bat 中运行

Powershell 命令未在 CMD 或 .bat 中运行

我正在尝试将 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 上运行。

截屏

链接到存储库 CommandLineHelper

答案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-=!"



相关内容