我对PowerShell比较陌生,并且有一个脚本可以读取一个配置文件,该文件会产生一组名称值对,我希望将它们作为参数传递给第二个PowerShell脚本中的函数.
我不知道在设计时将在此配置文件中放置哪些参数,所以就在我需要调用第二个PowerShell脚本时,我基本上只有一个变量具有第二个脚本的路径,第二个脚本变量,它是要传递给路径变量中标识的脚本的参数数组.
因此,包含第二个脚本($ scriptPath)路径的变量可能具有如下值:
"c:\the\path\to\the\second\script.ps1"
Run Code Online (Sandbox Code Playgroud)
包含参数($ argumentList)的变量可能类似于:
-ConfigFilename "doohickey.txt" -RootDirectory "c:\some\kind\of\path" -Max 11
Run Code Online (Sandbox Code Playgroud)
如何从这种状态到使用$ argumentList中的所有参数执行script.ps1?
我希望来自第二个脚本的任何write-host命令对于调用此第一个脚本的控制台是可见的.
我尝试过dot-sourcing,Invoke-Command,Invoke-Expression和Start-Job,但我还没有找到一种不会产生错误的方法.
例如,我认为最简单的第一条路线是尝试按如下方式调用Start-Job:
Start-Job -FilePath $scriptPath -ArgumentList $argumentList
Run Code Online (Sandbox Code Playgroud)
...但是由于此错误而失败:
System.Management.Automation.ValidationMetadataException:
Attribute cannot be added because it would cause the variable
ConfigFilename with value -ConfigFilename to become invalid.
Run Code Online (Sandbox Code Playgroud)
...在这种情况下,"ConfigFilename"是第二个脚本定义的参数列表中的第一个参数,我的调用显然试图将其值设置为"-ConfigFilename",这显然是为了按名称标识参数,没有设定它的价值.
我错过了什么?
编辑:
好的,这是一个名为invokee.ps1的文件中的待调用脚本的模型
Param(
[parameter(Mandatory=$true)]
[alias("rc")]
[string]
[ValidateScript( {Test-Path $_ -PathType Leaf} )]
$ConfigurationFilename,
[alias("e")]
[switch]
$Evaluate,
[array]
[Parameter(ValueFromRemainingArguments=$true)]
$remaining)
function sayHelloWorld()
{
Write-Host "Hello, everybody, the config file is <$ConfigurationFilename>."
if ($ExitOnErrors)
{
Write-Host "I should …Run Code Online (Sandbox Code Playgroud) powershell parameter-passing command-line-arguments invoke-command start-job
我有一个命令行工具,通常会转储大约200多行输出.我正在寻找出现在此输出结尾的文本.当我将输出重定向到文件时:
C:\> somecommand > results.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
...此文件中只显示前100行左右的输出.同样,如果我将输出管道输入类似'findstr'的东西,接收程序将无法在大约第100行之后找到或操作任何文本.
shell的屏幕缓冲区大小设置似乎对可捕获的行数没有任何影响.
有什么想法在这里发生了什么?对于它的价值,有问题的命令是InstallShield 2012中的iscmdbld.exe.
我尝试过的其他命令(例如'dir')不会出现此问题.
只有在cmd窗口中运行命令时才能查看程序的完整输出.
假设我有一个如下所示的正则表达式,但我将它从一个文件加载到一个变量$ regex中,所以在设计时不知道它的内容是什么,但在运行时我发现它包含"version1", "version2","version3"和"version4"命名组:
"Version (?<version1>\d),(?<version2>\d),(?<version3>\d),(?<version4>\d)"
Run Code Online (Sandbox Code Playgroud)
......我有这些变量:
$version1 = "3"
$version2 = "2"
$version3 = "1"
$version4 = "0"
Run Code Online (Sandbox Code Playgroud)
...我在文件中遇到以下字符串:
Version 7,7,0,0
Run Code Online (Sandbox Code Playgroud)
...存储在变量$ input中,因此($ input -match $ regex)的计算结果为$ true.
如果我不知道它们出现在$ regex中的顺序,我怎么能用字符串$ input中的$ regex替换$ version1,$ version2,$ version3,$ version4的值中的命名组(我只知道$正则表达式包括这些命名组)?
我找不到任何描述使用组名作为匹配索引用变量值替换命名组的语法的引用 - 这是否支持?
编辑: 澄清 - 目标是替换任何类型的文本文件中的模板版本字符串,其中给定文件中的版本字符串需要替换可变数量的版本字段(可能是2,3或所有4个字段).例如,文件中的文本可能看起来像这些中的任何一个(但不限于这些):
#define SOME_MACRO(4, 1, 0, 0)
Version "1.2.3.4"
SomeStruct vs = { 99,99,99,99 }
Run Code Online (Sandbox Code Playgroud)
用户可以指定文件集和正则表达式以匹配包含字段的行,最初的想法是命名组将捕获各个字段.该实用程序具有应在文件中替换的各个版本字段值,但必须保留将包含替换的行的原始格式,并仅替换所请求的字段.
EDIT-2: 我想我可以根据每个匹配的位置和范围得到我需要的子串计算结果,但希望Powershell的替换操作能够为我节省一些工作.
EDIT-3: 所以,正如Ansgar在下面正确而简洁地描述的那样,没有办法(只使用原始输入字符串,一个正则表达式,你只知道命名组,以及产生的匹配)来使用" -替换"操作(或其他正则表达式操作)以执行命名组的捕获的替换,同时保留原始字符串的其余部分.对于这个问题,如果有人好奇,我最终使用下面的解决方案.YMMV,其他解决方案可行.非常感谢Ansgar提供的反馈和选择.
在以下代码块中:
$ regex中命名组的约束只是(我认为)命名组中的表达式不能嵌套,并且在输入字符串中最多应匹配一次.
# This will give us …Run Code Online (Sandbox Code Playgroud) 我需要一个适用于 .NET 和 Java 的对称密钥的安全存储。我需要能够以两种语言以编程方式而不是通过命令行工具从同一存储中存储和检索 HmacSha* 密钥。
我的第一次尝试是使用 PKCS12 密钥库从 Java 生成和存储密钥,这是一种便携式格式,我认为它支持存储密钥以及 X.509 证书的私钥。
但是,到目前为止,我的经验是它没有(注意:Java SE 6),在调用 java.security.KeyStore.setKeyEntry() 时抛出异常,抱怨我试图存储的密钥不是 PrivateKey .
我发现一篇文章声称这应该是可能的:http : //www.pixelstech.net/article/1420427307-Different-types-of-keystore-in-Java----PKCS12
但是,如果我从那篇文章中提取示例代码(标题为“存储密钥”部分下的示例),我会在对 setKeyEntry() 的同一调用中得到相同的异常。
有谁知道我是否可以使用 Java 中的 PKCS12 密钥库满足这些要求?
FWIW,这是代码:
public void gen( String thePath, String thePassword ) throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("HmacSHA1");
Key key = keygen.generateKey();
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(null, null);
// This call throws an exception
keystore.setKeyEntry("theKey", key, thePassword.toCharArray(), null);
keystore.store( new FileOutputStream(thePath), thePassword.toCharArray() );
}
Run Code Online (Sandbox Code Playgroud)
编辑:嗯 - 在 .NET …
我正在使用Rx-ified API for vertx,这个问题必须做一个潜在的无限重试 - 直到成功循环我想实现但是有困难.我是RxJava的新手.
这是我想做的事情:
我遇到的第一个问题是如何完成步骤2).
如果您熟悉vert.x Rx api,这就是在上面的步骤1)中发出请求的意思:
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject );
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个Observable实例,该实例将发出响应或错误(例如,如果有超时).Observable将永远不会再发出任何东西(或者每次订阅时它总会发出完全相同的东西,我不知道哪个).
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
.retry()
Run Code Online (Sandbox Code Playgroud)
我认为为了发出重试,我可以使用RxJava的retry()运算符,我尝试过,但由于源可观察的性质,这样做完全没有任何有用的效果.没有新的请求消息被发送,因为唯一被"重试"的是订阅原始源,它永远不会发出任何不同的东西.
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
.retryWhen( error -> {
return _vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
})
Run Code Online (Sandbox Code Playgroud)
所以我想我可以使用RxJava的retryWhen()运算符,它允许我在根observable发出错误时发出第二个observable.我想,第二个可观测量可能与上面第一步产生初始观察者的代码相同.
但是,retryWhen()运算符(请参阅文档)不允许第二个observable发出错误而不会因错误而结束订阅.
所以,我无法弄清楚如何在这个链的第一部分内建立一个潜在的无限重试循环.
我必须在这里遗漏一些东西,但我无法确定它是什么.
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
// imagine that retryWhen() accomplishes an infinite retry
.retryWhen( error -> {
return _vertx.eventBus().<JsonObject>sendObservable( ... )
})
.flatMap( response -> {
// inspect response, if it has …Run Code Online (Sandbox Code Playgroud) cwd我正在 PowerShell 控制台会话中,尝试从 PowerShell 命令行运行存在于其中的 Gradle 脚本。
Gradle 命令接受一个参数,其中包含可以包含一个或多个管道字符的引号,但我一生都无法弄清楚如何让 PowerShell 仅使用一行(或任意多行,实际上 -但我对多线解决方案不感兴趣)。
这是命令:
./gradlew theTask -PmyProperty="thisThing|thatThing|theOtherThing"
Run Code Online (Sandbox Code Playgroud)
...这会产生此错误:
'thatThing' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有这些变体,但都不起作用。任何想法?
./gradlew theTask -PmyProperty="thisThing`|thatThing`|theOtherThing"
./gradlew theTask -PmyProperty=@"thisThing|thatThing|theOtherThing"
./gradlew theTask -PmyProperty="thisThing\|thatThing\|theOtherThing"
./gradlew theTask -PmyProperty="thisThing\\|thatThing\\|theOtherThing"
./gradlew theTask -PmyProperty="thisThing^|thatThing^|theOtherThing"
Run Code Online (Sandbox Code Playgroud) 我有一个PowerShell脚本,可以从powershell shell和cmd窗口中运行得很好,现在我尝试从Visual Studio中的后期构建步骤启动它.
在尝试将其送到午餐并成功运行的几种不同变体之后,我目前对VS2010中"后构建事件"的"命令行"属性进行了以下配置.
这只是Post-Build配置中的一行,但为了便于阅读,我将文本包装在这里:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive
-File "$(SolutionDir)testScript.ps1"
-ConfigurationFile "$(SolutionDir)configuration.txt"
-SolutionDir "$(SolutionDir)"
-Platform "$(Platform)"
-Configuration "$(Configuration)"
Run Code Online (Sandbox Code Playgroud)
powershell脚本需要4个必需参数:ConfigurationFile,SolutionDir,Platform和Configuration.如您所见,我提供上述每个参数,并将它们用双引号括起来以防止值中的空格.
在VS2010中,SolutionDir宏扩展为具有空格的路径,Platform扩展为"Release",Configuration扩展为"Win32".
执行后构建步骤时,这是我得到的错误:
testScript.ps1 : Cannot process command because of one or more missing
mandatory parameters: Platform Configuration.
+ CategoryInfo : InvalidArgument: (:) [testScript.ps1],
ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingMandatoryParameter,testScript.ps1
Run Code Online (Sandbox Code Playgroud)
......任何想法,我可能会失踪?它显然能够在$(SolutionDir)中找到该脚本,但我无法判断它是否正在接收任何命令行参数.$(SolutionDir)中的尾随'\'字符是否可以挂起来?
我读过不同的方法很多线程来获取Windows批处理文件分析器妥善处理有空格,括号和其他特殊字符变量,但没有建议似乎能解决我遇到的问题.
这是脚本(在尝试任何变通方法之前),其目标是根据为variable01和variable02找到的值设置variable03的值:
set variable01="C:\Program Files (x86)\SomeProgram\Subfolder"
set variable02="${macro}"
set variable01=%variable01:"=%
set variable02=%variable02:"=%
set variable03=""
if %variable02:~0,1%==$ (
if %variable01:~0,1%==$ (
set variable03=%variable03:"=%
) else (
set variable03=-o '%variable01%'
)
)
Run Code Online (Sandbox Code Playgroud)
... variable01和variable02的值事先不知道 - 它们是由之前运行脚本另一个程序取代,因此,上述脚本示出设置variable01和variable02值的那个替换已被制成之后的示例.
运行此脚本时出现的错误是:
\SomeProgram\Subfolder' was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)
...对应于上述脚本中的最后一个"set"行.我假设这个错误是由于variable01的值括起来的.
如果我将该行更改为:
set "variable03=-o '%variable01%'"
Run Code Online (Sandbox Code Playgroud)
...然后我收到此错误:
Files was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)
...这似乎表明它正在尝试对variable01中的空格进行标记,并且解析器仍然不满意.
如果我然后在脚本的顶部添加此行:
setlocal enableextensions enableDelayedExpansion
Run Code Online (Sandbox Code Playgroud)
...并将%variable01%更改为!variable01!,我仍然得到相同的错误.
显然,我不明白批处理文件解析器需要满足我的要求,即variable03的值具有以下值:
-o 'C:\Program Files (x86)\SomeProgram\Subfolder'
Run Code Online (Sandbox Code Playgroud)
...有什么建议?
我正在使用期望utf8编码的std :: string变量的代码.我希望能够处理用户提供的文件,该文件可能具有utf-16编码(我不知道设计时的编码,但最终希望能够处理utf8/16/32),读取它行-by-line,并将每一行转发给代码的其余部分作为utf8编码的std :: string.
我有c ++ 11(实际上,c ++ 11的当前MSVC子集)和1.55.0可以使用.我最终需要代码才能在Linux和Windows上运行.目前,我只是在Windows上使用Visual Studio 2013 Update 4进行原型设计,在Windows 7上运行.我对其他依赖项持开放态度,但他们需要建立一个已建立的跨平台(即windows和*nix)轨道记录,不应该是GPL/LGPL.
我一直在假设我似乎无法找到验证的方法,而且我的代码无效.
一个假设是,由于我最终希望std :: string变量中的这些文件中的每一行,我应该使用std :: ifstream,并使用正确构造的codecvt,以便传入的utf16流可以转换为utf8.
这个假设是否现实?我想,另一种选择是我必须对文本文件进行一些编码检查,然后根据结果选择wifstream/wstring或ifstream/string,这似乎比我想要开始时没有吸引力.当然,如果这是正确的(或唯一的现实的)路径,我愿意接受它.
我意识到我可能还需要进行一些编码检测,但就目前而言,我并不关心编码检测部分,只关注将utf16文件内容转换为utf8 std :: string.
我尝试过各种不同的locale和codecvt组合,但都没有.以下是我认为可行的最新版本,但不是:
void
SomeRandomClass::readUtf16LeFile( const std::string& theFileName )
{
boost::locale::generator gen;
std::ifstream file( theFileName );
auto utf8Locale = gen.generate( "UTF-8" );
std::locale cvtLocale( utf8Locale,
new std::codecvt_utf8_utf16<char>() );
file.imbue( utf8Locale );
std::string line;
std::cout.imbue( utf8Locale );
for ( int i = 0; i < 3; i++ )
{
std::getline( file, line );
std::cout << line << …Run Code Online (Sandbox Code Playgroud) 有人知道怎么做吗?
我有一个.bat脚本,我希望能够在命令行中使用它,以及在Visual Studio中使用后构建脚本.
该脚本接受参数,其中一些参数可以包含空格.
.bat脚本的路径可以包含空格,最好表示为相对于$(SolutionDir)的路径.
我尝试过看起来像命令行的一百种不同的封闭引号和转义字符组合,包括:
"$(SolutionDir)myScript.bat" "$(SolutionDir)\" "$(Platform)" "$(Configuration)"
call "$(SolutionDir)myScript.bat" "$(SolutionDir)" "$(Platform)" "$(Configuration)"
cmd /c ""$(SolutionDir)myScript.bat" "$(SolutionDir)" "$(Platform)" "$(Configuration)""
Run Code Online (Sandbox Code Playgroud)
但它们都会产生错误,我找不到有效的组合,而是通常会收到此错误:
"[path-to-script] is not recognized as an internal
or external command, operable program or batch file"
Run Code Online (Sandbox Code Playgroud)
从后构建步骤调用此方法的正确语法是什么?
我也有类似的问题将它设置为外部工具,因此非常感谢任何帮助!
batch-file visual-studio-2010 command-line-arguments post-build-event
powershell ×4
batch-file ×2
escaping ×2
buffer ×1
c++11 ×1
codecvt ×1
command-line ×1
control-flow ×1
cryptography ×1
dos ×1
event-bus ×1
java ×1
keystore ×1
locale ×1
named ×1
pkcs#12 ×1
redirect ×1
regex ×1
regex-group ×1
rx-java ×1
shell ×1
start-job ×1
utf-16 ×1
utf-8 ×1
variables ×1
vert.x ×1
windows ×1