Powershell中的任何方式都可以从一个可取的文件而不是文件中输入?
我需要将命令传递到另一个命令,现在通过首先使用其他命令创建文件,然后将该文件传递到原始命令来完成。 Code现在看起来像这样:
$val = "*some command*" + "`r`n" + "*some command*" + "`r`n" + "*some command*"
New-Item -name Commands.txt -type "file" -value $val
$command = @'
db2cmd.exe /C '*custom db2 command* < \Commands.txt > \Output.xml'
'@
Invoke-Expression -Command:$command
因此,我可以以某种方式只管道$val
commands.txt的内容来代替创建该文件吗?
答案 0 :(得分:0)
试试这个
$val = @("*some command*1","*some command2*","*some command3*")
$val | % { db2cmd.exe /C $_ > \Output.xml }
答案 1 :(得分:0)
如果您使用Write-Output
或其简写echo
,您应该可以从$ val输入,但是也可能值得尝试直接在命令行上传递命令。试试这个(如果它不起作用,我可以删除答案):
PS C:\> filter db2cmd() { $_ | db2cmd.exe ($args -replace '(\\*)"','$1$1\"') }
PS C:\> $val = @"
>> *custom db2 command*
>> *some command*
>> *some command*
>> *some command*
>> "@
>>
PS C:\> db2cmd /C $val > \Output.xml
这里发生的是Windows可执行文件从单个字符串接收命令行。如果从cmd.exe运行它们,则无法在参数字符串中传递换行符,但Powershell没有该限制,因此对于许多程序,您实际上可以将多行作为单个参数传递。我不知道db2cmd.exe
所以它可能在这里不起作用。
字符串替换的奇怪之处是处理参数中的任何双引号:Powershell不引用它们,大多数exe文件所期望的引用规则有点奇怪。
这里唯一的限制是$ val不得超过大约32,600个字符且不能包含空值。任何其他限制(例如非ascii unicode字符是否有效)将取决于应用程序。
失败:
echo $val | db2cmd.exe /C '*custom db2 command*' > \Output.xml
可能有用,或者您可以将它与我在顶部定义的过滤器结合使用:
echo $val | db2cmd /C '*custom db2 command*' > \Output.xml