我看过很多关于创建一个独特文件名的帖子,从天真的%TIME%到合理的(但不足)%RANDOM%.使用wmic os get localdatetime更好,但它仍然可以在多个CPU /核心机器上失败.在多核计算机上运行5+ shell时,以下脚本最终会失败.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (0, 1, 1000) DO (
FOR /F "usebackq" %%x IN (`wmic os get localdatetime ^| find "."`) do (set MYDATE=%%x)
ECHO MYDATE is now !MYDATE!
IF EXIST testuniq_!MYDATE!.txt (
ECHO FAILED ON !MYDATE!
GOTO TheEnd
)
COPY NUL >testuniq_!MYDATE!.txt
)
:TheEnd
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)
有没有人有可靠的方法在shell脚本中创建一个唯一的文件名?
我已经给予以下授权以获得许可,并且调用CMD.EXE似乎工作如下面的代码示例所示.
但是,我无法获得任何输出whoami.exe.我可以看到默认目录C:\app\oramgr\product\12.1.0\dbhome_1\database\出现在JJJ.TXT文件中.但是,该JJJ_WHOAMI.TXT文件不包含任何内容.
有什么建议?
dbms_java.grant_permission('PWATSON', 'SYS:java.io.FilePermission', 'C:\WINDOWS\SYSTEM32\CMD.EXE', 'execute');
dbms_java.grant_permission('PWATSON', 'SYS:java.io.FilePermission', 'C:\Windows\System32\whoami.exe', 'execute');
dbms_java.grant_permission('PWATSON', 'SYS:java.lang.RuntimePermission', '*', 'writeFileDescriptor');
dbms_java.grant_permission('PWATSON', 'SYS:java.lang.RuntimePermission', '*', 'readFileDescriptor');
dbms_java.grant_permission('PWATSON', 'SYS:java.io.FilePermission', 'C:\Users\pwatson', 'read, write');
dbms_java.grant_permission('PWATSON', 'SYS:java.io.FilePermission', 'C:\Users\pwatson\*', 'read, write');
dbms_java.grant_permission('PWATSON', 'SYS:java.io.FilePermission', 'C:\temp', 'read');
SQL> select util.RUN_CMD('C:\WINDOWS\system32\cmd.EXE /c CD C:\Users\pwatson\src\java ^& ECHO ^%CD^% ^& EXIT 4') as y from dual;
Y
----------
4
C:\app\oramgr\product\12.1.0\dbhome_1\DATABASE
SQL> select util.RUN_CMD('C:\WINDOWS\system32\cmd.EXE /c ECHO ^%CD^% >jjj.txt ^& EXIT 7') as y from dual;
Y
----------
7 …Run Code Online (Sandbox Code Playgroud) 我想创建一个包含两个数字的数组的数组.非常直截了当.但是,如果我在第一个数组之前没有提供前导逗号,则它是不正确的.为什么需要这个领先的逗号?
PS C:\src\powershell> Get-Content .\fr-btest.ps1
$files1 = @(
@(4, 1024)
, @((7), (16))
)
$files1
$files1.GetType()
$files1.Length
$files1.Count
'========'
$files2 = @(
, @(4, 1024)
, @((7), (16))
)
$files2
$files2.GetType()
$files2.Length
$files2.Count
PS C:\src\powershell> .\fr-btest.ps1
4
1024
7
16
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
3
3
========
4
1024
7
16
True True Object[] System.Array
2
2
Run Code Online (Sandbox Code Playgroud) 在Windows 7 Professional系统上,似乎无法运行New-SelfSignedCertificate.我可以在Windows 10系统上.
是的,shell是以"以管理员身份运行"启动的.
PS C:\> new-selfsignedcertificate
new-selfsignedcertificate : The term 'new-selfsignedcertificate' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that
the path is correct and try again.
At line:1 char:1
+ new-selfsignedcertificate
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (new-selfsignedcertificate:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 0 …Run Code Online (Sandbox Code Playgroud) 为什么-split参数的字符串需要两个反斜杠,而-join参数的字符串只需要一个反斜杠?反引号是Powershell中的转义字符.角色前面的反斜杠对你有什么作用?
$path = 'C:\folder\test\unit1\testing\results\report.txt'
$path -split '\\' -notlike '*test*' -join '\'
Run Code Online (Sandbox Code Playgroud)
http://powershell.com/cs/blogs/tips/archive/2014/06/17/fun-with-path-names.aspx
系统似乎安装了两 (2) 个版本的 PowerShellGet 模块。
Script 2.2 PowerShellGet
Script 1.0.0.1 PowerShellGet
Run Code Online (Sandbox Code Playgroud)
如何卸载旧版本?该Uninstall-Module命令似乎正在2.2目录中查找。这是为什么?
>Uninstall-Module -Name 'PowerShellGet' -RequiredVersion '1.0.0.1'
PackageManagement\Uninstall-Package : No match was found for the specified search criteria and module names 'PowerShellGet'.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\2.2\PSModule.psm1:12655 char:21
+ ... $null = PackageManagement\Uninstall-Package @PSBoundParameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Package], Exception
+ FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.UninstallPackage
Run Code Online (Sandbox Code Playgroud)
当我尝试指定旧版本时,它会报告新版本。
>Get-Module -FullyQualifiedName @{ModuleName="PowerShellGet";ModuleVersion="1.0.0.1"}
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 2.2 PowerShellGet {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}
>($PSVersionTable.PSVersion).ToString()
5.1.14409.1018 …Run Code Online (Sandbox Code Playgroud) 数组可以用作哈希表中的键吗?如何使用数组键引用哈希表项?
PS C:\> $h = @{}
PS C:\> $h[@(1,2)] = 'a'
PS C:\> $h
Name Value
---- -----
{1, 2} a # looks like the key is a hash
PS C:\> $h[@(1,2)] # no hash entry
PS C:\> $h.Keys #
1
2
PS C:\> $h[@(1,2)] -eq 'a'
PS C:\> $h[@(1,2)] -eq 'b'
PS C:\> foreach ($key in $h.Keys) { $key.GetType() } # this is promising
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\> $PSVersionTable.PSVersion.ToString() …Run Code Online (Sandbox Code Playgroud) 当我使用标准用户(也是管理员)登录时,该命令echo %PATH%返回系统路径+用户路径。如何只获取用户的路径?
例如,当我当前用户的路径是C:\ruby;C:\java\bin并且系统的路径是%SystemRoot%\system32;%SystemRoot%上面的命令返回时%SystemRoot%\system32;%SystemRoot%;C:\ruby;C:\java\bin,但我只想能够C:\ruby;C:\java\bin永久附加到用户的路径而不包含系统的路径垃圾。
我的目标是将目录附加到路径变量。setx PATH %PATH%;C:\ruby\bin我尝试使用由于系统路径而破坏了我的路径变量的命令来执行此操作。
C:>$PSVersionTable.PSVersion.ToString() 5.1.18362.145
当我使用时Install-Module -Name SqlServer,它报告:
C:>Install-Module -Name SqlServer
PackageManagement\Install-Package : The following commands are already available on this system:'Decode-SqlName,Encode-SqlName,SQLSERVER:,Add-SqlAvailabilityData
base,Add-SqlAvailabilityGroupListenerStaticIp,Add-SqlFirewallRule,Backup-SqlDatabase,ConvertFrom-EncodedSqlName,ConvertTo-EncodedSqlName,Convert-UrnToPath,Disabl
e-SqlAlwaysOn,Enable-SqlAlwaysOn,Get-SqlCredential,Get-SqlDatabase,Get-SqlInstance,Get-SqlSmartAdmin,Invoke-PolicyEvaluation,Invoke-Sqlcmd,Join-SqlAvailabilityGr
Run Code Online (Sandbox Code Playgroud)
是的,这些似乎来自 SQLPS 模块。是否不可能有两 (2) 个模块具有相同的导出名称?
更新:
好的,-AllowClobber 确实避免了错误消息。但现在我似乎可以从 和 获取SqlServer命令SQLPS。
C:>获取命令-Sql
CommandType Name Version Source
----------- ---- ------- ------
Alias Decode-SqlName 21.1.18121 SqlServer
Alias Decode-SqlName 14.0 SQLPS
Alias Encode-SqlName 21.1.18121 SqlServer
Alias Encode-SqlName 14.0 SQLPS
Cmdlet Add-SqlAvailabilityDatabase 21.1.18121 SqlServer
Cmdlet Add-SqlAvailabilityDatabase 14.0 SQLPS
Run Code Online (Sandbox Code Playgroud)
但是,Get-Command以不同的方式使用,仅显示来自SqlServer模块的命令。
C:>Get-Command Get-Sqli*
CommandType Name …Run Code Online (Sandbox Code Playgroud) 我正在尝试从库更新 PSFTP 模块。我使用了Remove-Module,但这三 (3) 个别名仍然存在。如何在安装当前 PSFTP 模块之前删除它们?
PS C:\src\t\ftp> Get-Command *ftp*
CommandType Name Version Source
----------- ---- ------- ------
Alias Move-FTPItem 1.6.1.2 PSFTP
Alias Receive-FTPItem 1.6.1.2 PSFTP
Alias Send-FTPItem 1.6.1.2 PSFTP
Function Get-SFTPChildItem 2.0.2 Posh-SSH
Function Get-SFTPContent 2.0.2 Posh-SSH
...
PS C:\src\t\ftp> Remove-Item -Path Alias:Move-FTPItem
Remove-Item : Cannot find path 'Alias:\Move-FTPItem' because it does not exist.
At line:1 char:1
+ Remove-Item -Path Alias:Move-FTPItem
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Alias:\Move-FTPItem:String) [Remove-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
Run Code Online (Sandbox Code Playgroud)
附加信息
我不确定是如何 …
powershell ×7
cmd ×3
windows ×3
arrays ×1
batch-file ×1
oracle ×1
plsql ×1
quoting ×1
registry ×1
sql-server ×1