相关疑难解决方法(0)

如何在双引号字符串中使用对象的属性?

我有以下代码:

$DatabaseSettings = @();
$NewDatabaseSetting = "" | select DatabaseName, DataFile, LogFile, LiveBackupPath;
$NewDatabaseSetting.DatabaseName = "LiveEmployees_PD";
$NewDatabaseSetting.DataFile = "LiveEmployees_PD_Data";
$NewDatabaseSetting.LogFile = "LiveEmployees_PD_Log";
$NewDatabaseSetting.LiveBackupPath = '\\LiveServer\LiveEmployeesBackups';
$DatabaseSettings += $NewDatabaseSetting;
Run Code Online (Sandbox Code Playgroud)

当我尝试使用字符串执行命令中的一个属性时:

& "$SQlBackupExePath\SQLBackupC.exe" -I $InstanceName -SQL `
  "RESTORE DATABASE $DatabaseSettings[0].DatabaseName FROM DISK = '$tempPath\$LatestFullBackupFile' WITH NORECOVERY, REPLACE, MOVE '$DataFileName' TO '$DataFilegroupFolder\$DataFileName.mdf', MOVE '$LogFileName' TO '$LogFilegroupFolder\$LogFileName.ldf'"
Run Code Online (Sandbox Code Playgroud)

它试图只使用值$DatabaseSettings而不是值$DatabaseSettings[0].DatabaseName,这是无效的.
我的解决方法是将其复制到一个新变量中.

如何直接在双引号字符串中访问对象的属性?

powershell string-interpolation

84
推荐指数
5
解决办法
5万
查看次数

在参数模式中涉及变量引用和子表达式的不带引号的标记:为什么它们有时会被分成多个参数?

注意:此问题的摘要已在PowerShell GitHub存储库中发布,因为已被此更全面的问题所取代.

传递给PowerShell中的命令的参数参数模式下进行解析(与表达式模式相反- 请参阅参考资料Get-Help about_Parsing).

方便地,(双)引用不包含空格或元字符的参数通常是可选的,即使这些参数涉及变量引用(例如$HOME\sub)或子表达式(例如,version=$($PsVersionTable.PsVersion).

在大多数情况下,这些不带引号的参数被视为双引号字符串,并且通常的字符串插值规则适用(除了元字符,例如,需要转义).

我试图在这个答案中总结参数模式中未加引号的标记的解析规则,但是有一些奇怪的边缘情况:

具体来说(从Windows PowerShell v5.1开始),为什么以下每个命令中的未加引号的参数标记不被识别为单个可扩展字符串,并导致传递2个参数(变量reference/subexpression保留其类型) ?

  • $(...)在令牌的开头:

    Write-Output $(Get-Date)/today # -> 2 arguments: [datetime] obj. and string '/today'
    
    Run Code Online (Sandbox Code Playgroud)
    • 请注意,以下工作符合预期:

      • Write-Output $HOME/sub - 简单的var.一开始就参考
      • Write-Output today/$(Get-Date) - 子表达式不是一开始

syntax powershell parameter-passing command-line-parsing

20
推荐指数
1
解决办法
535
查看次数

在命令中使用变量(PowerShell)

$computer = gc env:computername

# Argument /RU '$computer'\admin isn't working.
SchTasks /create /SC Daily /tn "Image Verification" /ST 18:00:00 /TR C:\bdr\ImageVerification\ImageVerification.exe /RU '$computer'\admin /RP password
Run Code Online (Sandbox Code Playgroud)

基本上我需要在计划任务中提供计算机名称...

先感谢您!

variables powershell quoting string-interpolation

5
推荐指数
1
解决办法
1万
查看次数

Powershell 子表达式无法识别“pkg-config --cflags --libs opencv4”命令

我想仅使用 CLI 在 Windows 上编译 OpenCV C/C++ (MSYS2) 程序。GNU Bash 执行此操作的方法是(在 MSYS2 MINGW64 Shell 上运行良好):

g++ main.cc -o main `pkg-config --cflags --libs opencv4`
Run Code Online (Sandbox Code Playgroud)

Bash 完美地将反引号识别为子表达式,但 PowerShell 却不能:

> g++ main.cc -o main `pkg-config --cflags --libs opencv4`
g++.exe: error: unrecognized command-line option '--cflags'
g++.exe: error: unrecognized command-line option '--libs'
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,PowerShell 上的等效项是

g++ main.cc -o main $(pkg-config --cflags --libs opencv4)
Run Code Online (Sandbox Code Playgroud)

尽管$(pkg-config --cflags --libs opencv4) 这是在 PowerShell 中编写子表达式的正确方法,因为echo命令显示它会产生正确的输出(在这种情况下,编译器包含我需要的链接器标志):

> echo $(pkg-config --cflags --libs opencv4)
-IC:/msys64/mingw64/bin/../include/opencv4 -LC:/msys64/mingw64/bin/../lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco …
Run Code Online (Sandbox Code Playgroud)

c++ bash powershell opencv

5
推荐指数
1
解决办法
212
查看次数

将带有复杂参数的批处理文件命令转换为 PowerShell

我在 .bat 中有以下内容(这有效):

"%winscp%" /ini=nul ^
           /log=C:\TEMP\winscplog.txt ^
           /command "open scp://goofy:changeme@10.61.10.225/ -hostkey=""ssh-rsa 2048 d4:1c:1a:4c:c3:60:d5:05:12:02:d2:d8:d6:ae:6c:5d""" ^
           "put ""%outfile%"" /home/public/somedir/somesubdir/%basename%" ^
           "exit"
Run Code Online (Sandbox Code Playgroud)

我试图将其复制到这样的 powershell 脚本中:

& $winscp "/ini=nul" `
           "/log=C:\TEMP\winscplog.txt" `
           "/command" 'open sftp://goofy:changeme@10.61.10.225/ -hostkey="ssh-rsa 2048 d4:1c:1a:4c:c3:60:d5:05:12:02:d2:d8:d6:ae:6c:5d"' `
           "put `"" + $outfile + "`" /home/public/somedir/somesubdir/" + $basename `
           "exit"
Run Code Online (Sandbox Code Playgroud)

当我运行 .bat 脚本时,文件将上传。

当我运行 .ps1 脚本时,我得到 Host key does not match configured key ssh-rsa

我怀疑我没有在 powershell 中正确格式化命令,并且在 winscp 看到它时主机密钥已经损坏。

我检查了日志,显示的只是来自主机的主机密钥。它没有显示我正在使用的密钥。我通过更改我的主机并注意到它没有出现在日志中来确认这一点。我比较了 .bat 和 .ps1 之间的日志,不同之处在于 ps1 以上述错误终止。

winscp 是一个 sftp 实用程序。

syntax powershell winscp

4
推荐指数
1
解决办法
1044
查看次数

如何在运行 .exe 时使用安装参数和 -wait

我想安装 SQLServer2014SP1,然后安装 SQL Data Tools。在安装 SQL Data Tools 之前,我需要它等待 SP1 完成。

这是我一直在尝试的:

Write-Host "Launching SQL SP 1 ..."
Start-Process "\\mynetworkpath\SQLServer2014SP1.exe" -wait /qs /IAcceptSQLServerLicenseTerms /Action=Patch /AllInstances 

Write-Host "Lauching SQL Server Data Tools install ..."
& "\\mynetworthpath\SSDTBI_x86_ENU.exe" /ACTION=INSTALL /FEATURES=SSDTBI,SNAC_SDK /Q /IACCEPTSQLSERVERLICENSETERMS
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的-wait/安装参数组合,但是我收到了 SP1 安装失败的一般错误,或者它会完成并且 SSDT 安装永远不会启动。

如果有更好的方法来做到这一点,我愿意接受建议。但它确实必须是自动化的。

powershell

3
推荐指数
1
解决办法
1045
查看次数

如何将 TimeSpan 参数传递给脚本?

我是 powershell 的新手,还只使用过 string 类型的脚本参数。现在我尝试创建一个脚本来删除早于给定时间跨度的备份,类似于这个:

Param(
    [parameter(Mandatory=$true)]
    [string] $BackupFolder,
    [parameter(Mandatory=$true)]
    [Timespan] $StorageDuration
)
$BackupFolder | ls -ad |? { (New-TimeSpan -Start $_.CreationTime -End Get-Date) -ge $StorageDuration} |% {$_|rm -Confirm:$false -Recurse}
Run Code Online (Sandbox Code Playgroud)

有没有办法让来自 PS 命令行的调用者传递一个时间跨度参数,例如 'New-TimeSpan -Days 7' ?我做了一个解决方法,其中仅将天数作为参数传递,但我不喜欢此限制,并且更愿意将整个时间跨度作为单个参数传递,可能包括天数、分钟数、小时数等。

我的脚本中还有两个我不明白的小问题。也许你也可以回答这些来帮助我提高我的 powershell 知识:

  1. MSDN说 d 和 ad 是 Directory 参数的别名。但是当我使用 d 而不是 ad 时,我收到一条错误消息,指出没有指定参数深度的参数。他们在那里混合了一些东西吗?

  2. 为什么我必须在 -Confirm 和 $false 之间写一个冒号?当我省略它时,它告诉我没有位置参数采用值 false。

powershell

3
推荐指数
1
解决办法
540
查看次数

如何从 Powershell 运行这个 Beyond Compare 脚本?

目前我可以使用 Beyond Compare 脚本将结果输出到文件。你们都能够帮助我弄清楚如何通过 Powershell 检查结果文本文件中的差异。不过,我还有一个问题。要将结果存入文本文件,Beyond Compare 让您使用一个基本脚本,然后通过 cmd 运行该脚本。我的问题是如何通过 Powershell 而不是 cmd 运行脚本?下面是 cmd 中用于运行脚本的命令。

c:\Program Files\Beyond Compare 4>bcompare.exe @"C:\script.txt" "C:\test1" "C:\test" "C:\bcreport\report.txt"
Run Code Online (Sandbox Code Playgroud)

它引用的脚本如下。

load "%1" "%2"
expand all
folder-report layout:side-by-side options:display-mismatches output-to:"%3"
Run Code Online (Sandbox Code Playgroud)

感谢您提供任何意见。让它工作是我正在处理的更大的 Powershell 脚本的一部分。如果我可以让它从 Powershell 运行,它将为我节省大量时间,因为我将能够编写需要数小时的脚本。

powershell

3
推荐指数
1
解决办法
376
查看次数

带有格式运算符的 Powershell 颜色格式

我在脚本中使用格式运算符,示例如下:

$current = 1
$total   = 1250
$userCN  = "contoso.com/CONTOSO/Users/Adam Smith"

"{0, -35}: {1}" -f "SUCCESS: Updated user $current/$total", $userCN
Run Code Online (Sandbox Code Playgroud)

这 expectedly 显示以下输出:

SUCCESS: Updated user 1/1250 : contoso.com/CONTOSO/Users/Adam Smith

格式运算符用于将目标输出文本保持在原位,当前/总运行数字在 1-99999 之间变化。如果没有格式运算符,我可以像这样突出显示成功行:

Write-Host -BackgroundColor Black -ForegroundColor Green "SUCCESS: Updated user $current/$total: $userCN"

但问题是如何将高亮颜色与格式运算符结合使用?只有-f参数,它不允许颜色参数,因为它Write-Host与最初的不同。

syntax powershell parameter-passing

2
推荐指数
1
解决办法
513
查看次数