运行 来自 VBS 的路径中包含空格的 Powershell 脚本

Running Powershell script with spaces in path from VBS

有人可以帮忙写这个脚本吗?基本上,它由 vbs 运行 并且为每个用户设置选项 运行 脚本。

脚本在支持dos 8.3文件系统的机器上可以正常运行,但是我们也有不少镜像系统没有这个能力...

所以我徒劳地试图让不支持 8.3 的机器到 运行 这个。 Powershell 不喜欢文件路径中的 space...,我正在尝试 运行 脚本。

Objshell.Run "powershell.exe (gc c:\users$env:USERNAME\Mydocu~1\Canadi~1\FileImportSettings.config) -replace 'temp','server\blahblah' | out-file c:\users$env:USERNAME\Mydocu~1\Canadi~1\FileImportSettings.config",0

评论越来越乱,所以我post将其进一步添加到原始 post..

我最初 post 编辑的是我尝试解决问题的一部分,但不会 运行。这个编辑过的确实...但是当我尝试将其更改为双引号时,代码不再将用户名更改为 %username%。我已经尝试 运行 直接执行命令,但 cmd 抱怨 out-file 不是可识别的有效命令。

Wscript.echo "powershell.exe (gc ""c:\users\""$env:USERNAME""\Documents\Canadian...\FileImportSettings.config"") -replace 'temp','server\blahblah' | out-file ""c:\users\""$env:USERNAME""\Documents\Canadian....\FileImportSettings.config""",0

带空格的文件名shell.

在(8.3 别名)路径中没有空格的简单 powershell 命令:

==>powershell (gc .$env:USERNAME\yyyy.txt) -replace 'efg h','E FGH'
xxx1 abc D
xxx2 E FGH
xxx3 ijk L

准备路径中带有空格的(长)文件名(字符串连接)。单引号导致字面值被回显;双引号导致变量的实际值被回显):

powershell (gc $("'.\'"+$env:USERNAME+"'\yyyy.txt'")) -replace 'efg h','E FGH'

将(8.3别名)路径替换为(长)文件名,路径中有空格:

powershell (gc $("'.\'"+$env:USERNAME+"'\yy yy.txt'")) -replace 'efg h','E FGH'

管道:|出档.

我们必须在下一个命令中转义 | 管道字符,以便将其转发到 PoverShell;否则,它适用于 cmd shell,但有 'out-file' is not recognized as an internal or external command, operable program or batch file 错误。

powershell (gc $("'.\'"+$env:USERNAME+"'\yy yy.txt'")) -replace 'efg h','E FGH' ^| out-file $("'.\'"+$env:USERNAME+"'\yy yy.txt'")

VBScript.

将所有内部 " 双引号加倍。需要使用绝对路径作为文件名至于另一个工作目录...

' 30064463
option explicit
Dim cmdLine, objShell
cmdLine = "powershell (gc $(""'D:\bat\'""+$env:USERNAME+""'\yy yy.txt'"")) -replace 'efg h','E FGH' ^| out-file $(""'D:\bat\'""+$env:USERNAME+""'\yy yy.txt'"")"
Wscript.Echo cmdLine
Set objShell = WScript.CreateObject("WScript.Shell")
Objshell.Run "cmd /C " & cmdLine, 1, true
Wscript.Quit

输出。

==>type  "D:\BAT\%username%\yy yy.txt"
xxx1 abc D
xxx2 efg H
xxx3 ijk L

==>cscript D:\VB_scripts\SO064463.vbs
powershell (gc $("'D:\bat\'"+$env:USERNAME+"'\yy yy.txt'")) -replace 'efg h','
E FGH' ^| out-file $("'D:\bat\'"+$env:USERNAME+"'\yy yy.txt'")

==>type  "D:\BAT\%username%\yy yy.txt"
xxx1 abc D
xxx2 E FGH
xxx3 ijk L

==>