我想运行一个外部进程并将其命令输出捕获到PowerShell中的变量.我目前正在使用这个:
$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait
Run Code Online (Sandbox Code Playgroud)
我已经确认命令正在执行但我需要将输出捕获到变量中.这意味着我无法使用-RedirectOutput,因为这只会重定向到文件.
默认情况下,当您将命令的输出重定向到文件或将其传递到PowerShell中的其他内容时,编码为UTF-16,这是无用的.我想把它改成UTF-8.
它可以通过替换>foo.txt语法来逐个进行,| out-file foo.txt -encoding utf8但是每次都必须重复这是很尴尬的.
在PowerShell中设置内容的持久方法是将它们放入\Users\me\Documents\WindowsPowerShell\profile.ps1; 我已经验证这个文件确实是在启动时执行的.
有人说输出编码可以设置,$PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}但我已经尝试过,它没有任何效果.
https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/谈到$OutputEncoding乍一看似乎应该是相关的,但后来谈到输出被编码在ASCII中,这不是实际发生的事情.
如何设置PowerShell使用UTF-8?
我一直在比较多个系统之间的哈希值,并惊讶地发现PowerShells哈希值与其他终端的哈希值不同.
Linux终端(CygWin,Bash for Windows等)和Windows命令提示符都显示相同的哈希,而PowerShell显示不同的哈希值.
这是使用SHA256测试的,但在使用其他算法(如md5)时发现了同样的问题.
编码更新:
尝试更改PShell编码,但它对返回的哈希值没有任何影响.
[Console]::OutputEncoding.BodyName
iso-8859-1
[Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
utf-8
Run Code Online (Sandbox Code Playgroud)
GitHub PowerShell问题
我正在尝试通过以下方式重定向 PowerShell 中的输入:
Get-Content input.txt | my-program args
Run Code Online (Sandbox Code Playgroud)
问题是管道 UTF-8 文本前面有一个 BOM (0xEFBBBF),我的程序无法正确处理它。
一个最小的工作示例:
// File: Hex.java
import java.io.IOException;
public class Hex {
public static void main(String[] dummy) {
int ch;
try {
while ((ch = System.in.read()) != -1) {
System.out.print(String.format("%02X ", ch));
}
} catch (IOException e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 PowerShell 中:
javac Hex.java
Set-Content textfile "ABC" -Encoding Ascii
# Now the content of textfile is 0x41 42 43 0D 0A
Get-Content textfile | java Hex
Run Code Online (Sandbox Code Playgroud)
或者干脆 …
我想在通过管道传输(例如,文件)时将文本打印为 UTF-8,因此在 Windows 10 上的 Python 3.7.3 上通过 PowerShell,我这样做:
import sys
if not sys.stdout.isatty():
sys.stdout.reconfigure(encoding='utf-8')
print("Mamma mia.")
Run Code Online (Sandbox Code Playgroud)
当 run as 时encodingtest.py > test.txt,test.txt结果是这样的:
00000000 FF FE 4D 00 61 00 6D 00 6D 00 61 00 20 00 6D 00 ÿþM.a.m.m.a. .m.
00000010 69 00 61 00 2E 00 0D 00 0A 00 i.a.......
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它以 开头FF FE,它是 UTF-16-LE 的字节顺序标记——并且在字符之间打印空字节(就像 UTF-16 那样)!但是,当我通过 CMD 而不是 PowerShell 运行它时,它可以很好地打印 UTF-8。即使通过 PowerShell 进行管道传输,我如何让 Python 打印 UTF-8?
我可以运行encodingtest.py …
我已经将当前的视频项目从命令提示符切换到PowerShell,以便可以充分利用的Tee-Object多输出代码。
当前,我有一个可以批量工作的代码版本,但是我需要通过T型添加另一个功能。这是我第一次使用PowerShell,因此这可能是一个简单的修复方法...
目前,我已经弄清楚了如何在PowerShell中运行ffmpeg以及如何运行ffplay,并且我有一个批处理程序,该程序接受ffmpeg输出并将其通过管道传输到ffplay,并且效果很好。我也可以ffplay在PS中正常播放。在PS中,此代码有效:
ffplay -video_size 1280x720 -pixel_format uyvy422 -framerate 60 -i video="Decklink Video Capture"
Run Code Online (Sandbox Code Playgroud)
作为批处理,此代码可以很好地满足我的工作需求:
ffmpeg -video_size 1280x720 -pixel_format uyvy422 -framerate 60 -i video="Decklink Video Capture" -c:v libx265 -preset ultrafast -mpegts pipe: | ffplay pipe:
Run Code Online (Sandbox Code Playgroud)
它获取我想要的视频,然后通过管道将其播放到屏幕。但是,通过PowerShell播放时,视频甚至不会弹出。我没有收到任何警告或任何警告,它似乎运行良好,但没有显示图片。
最终目标是能够以全分辨率在主机显示屏上播放视频,并在网络中发布较低的比特率(如果有帮助的话)。
我已经chcp 65001在命令提示符和Windows Powershell中强制使用了一段时间,但是从SO和其他几个社区的问答环节来看,这似乎是一种危险且低效的解决方案。Microsoft是否提供一种chcp 65001可以永久保存而无需手动更改注册表的改进/完整替代方案?如果没有,将来是否有公开宣布的时间表或议程来支持Windows CLI中的UTF-8?
我个人已经使用了chcp 949韩国字符支持,但反斜线的怪异显示\在多个应用程序(如Neovim),以及字符和不正确/难以理解的显示器是不是韩国未通过支持949似乎变得更加的最近有问题。
我知道windows和unix中有不同的换行代码。但在 Powershell 中, 和 都`r`n用于`n换行。是否有从`n到 的自动转换`r`n?为什么必须使用引号而不是反斜杠?
我正在尝试将 Node.js 输出通过管道传输到 preatty-pino
node .\dist\GameNode.js | pino-pretty
在 CMD 中运行它我得到了我的格式化输出但是在 powershell 中运行它我什么也得不到。我读到 Powershell 在管道时正在使用对象,所以我试过了
node .\dist\GameNode.js | Out-String -Stream | pino-pretty
但这也行不通。
为什么它可以在 CMD 中工作,而不能在 Powershell 中工作?谢谢 :)
在 C 和 C++ 命令行程序中,在命令提示符或 PowerShell 中运行程序之间有什么区别吗?(例如:异常处理、I/O 速度等)
我检查了许多与此相关的问题,但找不到解决我的问题的东西。基本上,我想将 UTF-8 编码的字符串存储在变量中,然后使用该字符串作为文件名。
\n\n例如,我正在尝试下载 YouTube 视频。如果我们打印视频标题,则会显示非英文字符(ytd这里是youtube-dl):
./ytd https://www.youtube.com/watch?v=GWYndKw_zbw -e
输出:[LEEPLAY] \xec\x8b\x9c\xed\x8b\xb0\xed\x8c\x9d \xec\x9e\x85\xeb\xac\xb8 City Pop MIX (Playlist)
但是如果我将其存储在变量中并打印它,韩文字符将被忽略:
\n\n$vtitle= ./ytd https://www.youtube.com/watch?v=GWYndKw_zbw -e
$vtitle
输出:[LEEPLAY] City Pop MIX (Playlist)
我正在尝试将输出日志通过管道传输到另一个脚本进行处理。但是,如果我正确理解这个问题,powershell 会等待第一个命令完成,然后再将输出发送到第二个命令。
例如,这按预期工作(脚本收到“hi”),因为echo很快完成:
echo "hi" | python script.py
Run Code Online (Sandbox Code Playgroud)
而在这个(caddy是网络服务器,所以它没有完成)中,球童的标准输出永远不会到达脚本的标准输入:
caddy run | python script.py
Run Code Online (Sandbox Code Playgroud)
是否可以将第一个命令的输出异步转发到第二个命令,而无需等待第一个命令完成?
--
编辑:最小的例子
echo "hi" | python script.py
Run Code Online (Sandbox Code Playgroud)
caddy run | python script.py
Run Code Online (Sandbox Code Playgroud)
# output.py
from time import sleep
while True:
print("SENDING")
sleep(1)
Run Code Online (Sandbox Code Playgroud)
这有效(打印到 stdout Received: SENDING):
python onetime.py | python input.py
Run Code Online (Sandbox Code Playgroud)
这不起作用(没有打印任何内容):
python output.py | python input.py
Run Code Online (Sandbox Code Playgroud) powershell ×12
pipe ×3
utf-8 ×3
newline ×2
c ×1
c++ ×1
cmd ×1
encoding ×1
ffmpeg ×1
hash ×1
line-breaks ×1
linux ×1
pipeline ×1
process ×1
python ×1
windows ×1
windows-10 ×1
youtube-dl ×1