在批处理文件中链接 Powershell 命令?(Windows)

在批处理文件中链接 Powershell 命令?(Windows)

我正在批处理文件中运行 Powershell 命令来替换文本。

这是可行的,但是每次替换某些内容时它都会运行 Powershell 的一个实例:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1' | Set-Content $_.FullName}"

:: Replace foo2 with bar2
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo2', 'bar2' | Set-Content $_.FullName}"

:: Replace foo3 with bar3
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

有没有办法通过& ^在行尾、第二个命令的部分中添加类似的内容来链接这三个命令?

我想将每个-replace命令放在单独的行上,因为我有超过 100 个命令需要链接在一起。

我曾尝试过这样做,但没有效果:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1' | & ^

:: Replace foo2 with bar2
 | ForEach-Object {(Get-Content $_) -replace 'foo2', 'bar2' | & ^

:: Replace foo3 with bar3
 | ForEach-Object {(Get-Content $_) -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

我也尝试过不带&字符的上述操作。

我尝试ForEach-Object {(Get-Content $_)从中间行和最后一行删除,但没有用。

:: comments会造成问题吗?

我认为,由于这是用双引号括起来的 Powershell 命令,我将尝试这种方式,其中每行末尾的反勾和分号应该告诉 Powershell 继续执行命令并将下一行视为同一条命令的一部分:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1';`

# Replace foo2 with bar2
 | ForEach-Object {(Get-Content $_) -replace 'foo2', 'bar2';`

# Replace foo3 with bar3
 | ForEach-Object {(Get-Content $_) -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

(无效)

我尝试取出一些 Powershell 命令:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1';`

# Replace foo2 with bar2
'foo2', 'bar2';`

# Replace foo3 with bar3
'foo3', 'bar3' | Set-Content $_.FullName}"

(无效)。

我尝试过将所有评论全部删除,但没有成功。

我曾尝试将其添加-replace回每行的开头,但没有用。

尝试将其放在一行上是行不通的:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1'; -replace 'foo2', 'bar2'; -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

用竖线代替分号也不起作用:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1' | -replace 'foo2', 'bar2' | -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

可能有几十种不同的组合试图让它发挥作用,但我不知道什么是正确的方法,而且我也没有主意了。

;当与其他答案中描述的命令链接在一起时,这些命令不起作用。

干杯。

答案1

您想将多个命令放在一行中并从批处理文件中调用它吗?

您的方法不仅不起作用,因为您无法在批处理文件的一个命令中放入那么多字符,而且也不可能轻松地将它们链接起来。

这里显而易见的解决方案是仅使用 PowerShell 或将所有命令放在 .ps1 文件中,并将批处理文件中的 powershell 命令更改为:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -File MyFile.ps1

要编辑 .ps1 文件,请使用 PowerShell ISE。这不仅可以突出显示语法,还可以通过运行一个命令而不是整个脚本来轻松测试您正在执行的操作,并且您在脚本中设置的每个变量在执行后都会保留,因此您可以在脚本运行后在控制台中实时测试以调试哪里出现问题。

您在批处理文件中运行的每个命令都可以在 PowerShell 中运行。即使是逻辑等。而且 PowerShell 提供函数,因此您可以编写更易于阅读的代码。

答案2

您可以尝试一行包含多个内容.replace()
.replace('foo1','bar1').replace('foo2','bar2').replace('foo3','bar3')...

开始“”/wait /min /wait Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command“Get-ChildItem'*.txt'| foreach {(Get-Content $_).replace('foo1','bar1').replace('foo2','bar2').replace('foo3','bar3')|设置内容 $_.FullName -force}”

相关内容